在waitUntilAllOperationsAreFinished(NSOperationQueue)后面写了什么代码?

时间:2012-11-28 19:15:05

标签: objective-c ios nsoperationqueue

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/waitUntilAllOperationsAreFinished上对此方法的描述说:

调用时,此方法会阻塞当前线程,并等待接收方的当前和排队操作完成执行。当前线程被阻塞时,接收器继续启动已经排队的操作并监视正在执行的操作。在此期间,当前线程无法向队列添加操作,但其他线程可能。完成所有挂起操作后,此方法将返回。

我想知道 waitUntilAllOperationsAreFinished 背后的代码是什么允许这样的行为(阻止当前线程,接收器继续......)?我有兴趣编写一个产生类似行为的代码,所以我会感谢任何等效的(是的,Apple是黑盒子的代码)代码以类似的方式运行。

更具体地说:NSOperationQueue如何阻塞线程,同时允许接收器处理它的东西(我的猜测:运行currentRunLoop时调度信号量)?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如你所说,实施是未知的。但它很容易实现这种行为:

- (void)waitUntilAllOperationsAreFinished
{
    while(self.operationCount != 0)
        [self _dispatchOperation];
}

_dispatchOperation反过来会阻塞由队列管理的工作线程触发的信号量。当其中一个发出信号时,它会从队列中调度下一个操作。

答案 1 :(得分:1)

无意中,我发现了这个:How to implement an NSRunLoop inside an NSOperation,处理的问题与我在这里提出的问题完全相同:“那么如何实现与waitUntilFinished相同的行为:YES而不锁定主线程?”

与我的另一个SO主题配对:"Block" main thread (dispatch_get_main_queue()) and (or not) run currentRunLoop periodically - what is the difference?,它回答了我的问题。

稍后更新:有趣的源代码,这部分也与我的问题有关:https://github.com/gnustep/gnustep-base/blob/master/Source/NSOperation.m