一、DispatchGroup三種用法:
1.notify(依賴任務(wù))
let group = DispatchGroup()
myQueue?.async(group: group, qos: .default, flags: [], execute: {
for _ in 0...10 {
print("耗時任務(wù)一")
}
})
myQueue?.async(group: group, qos: .default, flags: [], execute: {
for _ in 0...10 {
print("耗時任務(wù)二")
}
})
//執(zhí)行完上面的兩個耗時操作, 回到myQueue隊列中執(zhí)行下一步的任務(wù)
group.notify(queue: myQueue!) {
print("回到該隊列中執(zhí)行")
}
2.wait(任務(wù)等待)
let group = DispatchGroup()
myQueue?.async(group: group, qos: .default, flags: [], execute: {
for _ in 0...10 {
print("耗時任務(wù)一")
}
})
myQueue?.async(group: group, qos: .default, flags: [], execute: {
for _ in 0...10 {
print("耗時任務(wù)二")
sleep(UInt32(3))
}
})
//等待上面任務(wù)執(zhí)行克懊,會阻塞當前線程,超時就執(zhí)行下面的员萍,上面的繼續(xù)執(zhí)行襟铭〖桑可以無限等待 .distantFuture
let result = group.wait(timeout: .now() + 2.0)
switch result {
case .success:
print("不超時, 上面的兩個任務(wù)都執(zhí)行完")
case .timedOut:
print("超時了, 上面的任務(wù)還沒執(zhí)行完執(zhí)行這了")
}
print("接下來的操作")
3.enter leave 手動管理group計數(shù),enter和leave必須配對
let group = DispatchGroup()
group.enter()//把該任務(wù)添加到組隊列中執(zhí)行
myQueue?.async(group: group, qos: .default, flags: [], execute: {
for _ in 0...10 {
print("耗時任務(wù)一")
group.leave()//執(zhí)行完之后從組隊列中移除
}
})
group.enter()//把該任務(wù)添加到組隊列中執(zhí)行
myQueue?.async(group: group, qos: .default, flags: [], execute: {
for _ in 0...10 {
print("耗時任務(wù)二")
group.leave()//執(zhí)行完之后從組隊列中移除
}
})
//當上面所有的任務(wù)執(zhí)行完之后通知
group.notify(queue: .main) {
print("所有的任務(wù)執(zhí)行完了")
}
二、項目中的實際用例
這次遇到的是一個循環(huán)網(wǎng)絡(luò)請求的功能(怎么老是遇上這種蛋疼的API)潮罪,要求本地存儲的數(shù)組里循環(huán)取出存儲對象康谆,并使用存儲對象的屬性做參數(shù)领斥,POST請求。然后將每次請求下來的數(shù)據(jù)進行累加計算沃暗,最后賦值月洛。上代碼:
func sumTheassets(compHandler:@escaping (_ sum:Float)->()) {
var asset:Float = 0
let group = DispatchGroup() //創(chuàng)建group
for object in objects { //for循環(huán)便利本地存儲的數(shù)組數(shù)據(jù)
group.enter() // 將以下任務(wù)添加進group
let cellViewmodel = MyassetsCellViewModel() // 創(chuàng)建VM對象,并調(diào)用網(wǎng)絡(luò)請求函數(shù)
cellViewmodel.getThepriceFromnew(symbol: object.symbol, compHandler: { (price, ratio) in
let decimals = Float(object.decimals) // 獲取數(shù)量孽锥,轉(zhuǎn)為Float型
let num = price * decimals! //計算總價格 單價 * 數(shù)量
asset += num //將計算結(jié)果累加
group.leave() //本次任務(wù)完成(即本次for循環(huán)任務(wù)完成)嚼黔,將任務(wù)從group中移除
})
}
group.notify(queue: .main) { // group中的所有任務(wù)完成后再主線程中調(diào)用回調(diào)函數(shù),將結(jié)果傳出去
compHandler(asset) //在回調(diào)里將累加結(jié)果傳出去
}
}
以上惜辑,祝大家在開發(fā)中都不遇到奇葩API接口或需求 (美好的理想盎=А)
引用鏈接:http://www.reibang.com/p/be5a277e1f96