GCD提示和技巧

Swift中的线程安全集合

在Swift中使用ArrayDictionary时,有时(可能很多次)可以看出它们不是线程安全的(在Swift中,更新对象的实例变量不是原子的)。
多个线程可以同时修改一个集合,并且当它们在同一位置写入时,可能导致该内存块损坏。
我们想要的是只有一个线程更新和多个读取(同时)。

这是读写问题的经典实例。
GCD提供.barrier标志,该标志仅在队列中没有其他操作时才执行块。 因此,这一次将写入次数限制为一次。

let queue = DispatchQueue(标签:“ some.unique.identifier”,属性:.concurrent)

创建并发队列后,我们的同步读取将同时发生。

使用.barrier异步分派写入操作将确保队列中每个当前正在执行的块在运行写入块之前都将完成。

私人函式写入(_补全:@转义(()->无效)){
queue.async(flags:.barrier){complete()}
}

func insert(_ object:T){
写{
self.container.append(对象)
}
}

对于完整的实现,请签出:https://gist.github.com/eigams/3bddcdd0427d5a40e85259d5f403e1d2

汇总多个并发任务的结果

在日常工作中,有时需要在for循环(具有不同的参数)中运行异步函数,然后在完成时必须通知我们,以汇总其结果。
类似于:

var容器:[String] = []

用于数组{
asyncFunction(…){导致
container.add(结果)
}
}

//用容器做点什么

GCD提供dispatch_group来提供帮助。 组通过.enter / .leave调用跟踪与之关联的项目。 当.leave调用匹配.enter时,它将调用传递给.notify的完成块

这样,我们可以展平具有完成块的函数。 当所有工作完成后,.notify下的块将被调用,然后我们就可以利用汇总结果

希望您喜欢阅读!