Ios 从并发线程同时在主DispatchQueue上调度块是否安全?

Ios 从并发线程同时在主DispatchQueue上调度块是否安全?,ios,swift,multithreading,grand-central-dispatch,Ios,Swift,Multithreading,Grand Central Dispatch,在我的代码中,我使用for循环将并发任务分派到全局分派队列,如下所示: for collectionMember in myCollection { DispatchQueue.global(qos: .default).async { // do stuff here with collectionMember and store in variable "result" DispatchQueue.main.async {

在我的代码中,我使用for循环将并发任务分派到全局分派队列,如下所示:

for collectionMember in myCollection {
    DispatchQueue.global(qos: .default).async {

        // do stuff here with collectionMember and store in variable "result"

        DispatchQueue.main.async {
            // code using variable "result" that must be executed serially on main thread
            // because accesses shared resources
        }
}
我对Grand Central Dispatch这件事还不熟悉,我担心当不同的并发线程尝试在主DispatchQueue上调度块时,会出现一些内存问题,因为它们都访问主DispatchQueue

我希望并发线程在完成时向主DispatchQueue添加一个块,而不会出现线程安全问题

我必须在向主DispatchQueue分派代码的块周围使用锁,还是调度块线程安全

最后,如果我有任何错误或有更简单的方法来解决这个问题,请告诉我。
谢谢

不需要锁。主队列是一个锁!这就是重点,很重要。它是一个串行队列;只要其他东西已经在执行,就不能在主队列上开始执行任何操作。主线程中没有并发。你所做的完全正确;请注意,您可能要在主线程上排列一大堆要执行的块,一次一个。但这不是一个问题,除非这里有很多。马特是对的。顺便说一下,当他们说“存储在变量结果中”时,请注意这应该是一个局部变量,而不是ivar/属性。从主队列更新属性。在“方案设置”下,临时打开“线程消毒剂”TSAN,这将警告您许多非线程安全问题。但是在测试完代码后,请关闭该选项。