2012-12-13 32 views
2

我想在当前执行的线程上同步执行一个NSOperation。我可以打电话给[NSOperation开始]吗?这是否总是在当前正在执行的线程中运行?如果使用[NSOperation start]手动执行,哪个线程会运行NSOperation?

另一种方法是只创建一个NSOperationQueue,添加操作然后调用waitUntilAllOperationsFinished选择器。

+0

我不知道你是否能在当前队列同步运行(除非它是一个队列允许并发操作),你能吗?如果您在主队列中并要求它同步执行某些操作(即等待它),则可以阻止主队列。你能澄清吗? – Rob

回答

3

如果您致电[NSOperation start],它将在当前线程上同步执行。所有围绕操作的异步工作都由NSOperationQueue处理,但如果您自己打电话给-start,那么您就绕过了所有这些。

当然,可以实现一个特定的子类,以在另一个线程上产生异步任务本身;这完全取决于它。但是,如果您调用-start,那么旨在在操作队列运行的任何线程中同步执行的操作也将在您的线程中同步执行。


例如,下面的代码,运行时:

NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"operation"); 
}]; 
[op start]; 
NSLog(@"complete"); 

打印:

operation 
complete 
+0

你是否有任何说明情况的参考?具体来说,它运行在“当前线程”上,我在其他地方看到它在主线程上运行,而不是当前线程。 – aloo

+0

@aloo:你在哪看到的?因为这是完全错误的。无论如何,文档指出:“此方法的默认实现更新操作的执行状态并调用接收方的主要方法。” '-main'用于非并发任务,例如只是同步运行的任务。 –

+0

非常感谢 - 在这里看到:“如果你在一个NSOperation的实例上调用”start“,而不将它添加到队列中,操作将在主循环中运行。”从:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues – aloo