背景:
总有那么个时候,需要多个请求完成了,才能进行下一个操作。 如果我们是嵌套着写,那代码未免有不伦不类的low吧。
那就使用线程通知,监听所有的请求完成了再做处理。那就涉及到信号的等待与结束的处理。是不是有点麻烦呀,不信你看咯
let serial = DispatchQueue(label: "serialQueue1")
let group = DispatchGroup()
serial.async { [weak self] in
let semaphore = DispatchSemaphore.init(value: 1)
// 二维码
group.enter()
semaphore.wait()
DispatchSafeMainAsync {
self?.qrcodeImgV.bc_setImageURLString(model.qrCodePath) { (img) in
group.leave()
semaphore.signal()
}
}
// 头像
group.enter()
semaphore.wait()
DispatchSafeMainAsync {
self?.userImgV.bc_setImageURLString(userHead, placeholder: UIImage(named: "icon_default_head")) { (img) in
group.leave()
semaphore.signal()
}
}
// 商品图片
group.enter()
semaphore.wait()
DispatchSafeMainAsync {
self?.goodsImgV.bc_setImageURLString(model.icon) { (img) in
group.leave()
semaphore.signal()
}
}
group.notify(queue: DispatchQueue.main) {
self?.didLoadCompletionBlock?()
}
}
这样的话。。。emmm
重复代码是否多了,能不能简化下。
那就看看吧
dispatchQueueNotify(groupBlocks: { [weak self] bl in
// 二维码
DispatchSafeMainAsync {
self?.qrcodeImgV.bc_setImageURLString(model.qrCodePath) { (img) in
bl()
}
}
},{[weak self] bl in
// 头像
DispatchSafeMainAsync {
self?.userImgV.bc_setImageURLString(userHead, placeholder: UIImage(named: "icon_default_head")) { (img) in
bl()
}
}
},{[weak self] bl in
// 商品图片
DispatchSafeMainAsync {
self?.goodsImgV.bc_setImageURLString(model.icon) { (img) in
bl()
}
}
}, completionBlock: {[weak self] in
self?.didLoadCompletionBlock?()
})
是不是觉得优雅多了,再也不用记那么多复杂的名字了,也不用写那么多重复的代码了,天空突然间晴朗了许多。
接下来就看看怎么实现的吧
func dispatchQueueNotify(groupBlocks:((@escaping(()->Void))->Void)..., completionBlock: @escaping(()->Void)) {
let serial = DispatchQueue(label: "serialQueue1")
let group = DispatchGroup()
serial.async {
let semaphore = DispatchSemaphore.init(value: 1)
for block in groupBlocks {
group.enter()
semaphore.wait()
// 结束的回调
let endb = {
group.leave()
semaphore.signal()
}
block(endb)
}
group.notify(queue: DispatchQueue.main) {
completionBlock()
}
}
}
霍霍,好像也没有那么高级,不也就抽离了重复的部分出来而已。
你这个遭老子坏得很呀,我信你个鬼。
其实作为码代码的我们,不就是不断使得我们代码写得更加优雅吗,也就是走上不断的提取公因数的封装之路而已。我只关心我的业务实现模块,多余的代码我都不想写。