2013-03-21 173 views
0
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     while(!weakSelf.isAnotherThreadCompleted && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) 
      ; 
     [weakSelf doSomething]; 

    }); 

将异步线程以这种方式等待另一个线程是否正确?GCD和线程等待

回答

1

您将停止对应于DISPATCH_QUEUE_PRIORITY_DEFAULT的全局队列。如果您向该队列派发其他内容,则在您完成等待之前,它不会执行。

另外,我不认为在这个调度队列对应的线程中会存在一个运行循环,所以你打算通过调用- currentRunLoop来创建一个循环,因为没有源代码会被附加到它,它会返回立即与值NO(或,将有一个随机运行循环,并且行为将是完全不可预知的)。

为什么不在工作线程的末尾调用一个块?或者只使用一种机制(GCD,NSOperation,线程,运行循环)及其同步,而不是混合它们?

+0

感谢您的详细解答,我只是想明白这样做是否正确。但我不明白为什么currentRunLoop会立即返回?现在它按照你说的那样工作,这就是为什么我打开这个话题。 – taffarel 2013-03-21 12:14:09

+0

查看文档' - runMode:beforeDate:',如果没有连接到运行循环的输入源或计时器,它将立即返回。就你而言,你可能创建了一个新的运行循环,所以它没有任何附加。另外,当你使用'dispatch_async'时,你不能控制代码运行的线程,这是OS和GCD的业务。运行循环是线程特定的,因此您不应该在GCD调用中使用它们(除非您在主队列中,这是唯一保证位于特定线程上的主线程)。 – Guillaume 2013-03-21 12:23:06