Swift如何优雅写多线程队列,来处理依赖关系

450 阅读1分钟

背景:

总有那么个时候,需要多个请求完成了,才能进行下一个操作。 如果我们是嵌套着写,那代码未免有不伦不类的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()
            }
        }
    }

霍霍,好像也没有那么高级,不也就抽离了重复的部分出来而已。

你这个遭老子坏得很呀,我信你个鬼。

其实作为码代码的我们,不就是不断使得我们代码写得更加优雅吗,也就是走上不断的提取公因数的封装之路而已。我只关心我的业务实现模块,多余的代码我都不想写。