1

如果我有下面定义的方法,传递给该方法的块(“处理程序”)是否会在由创建的新线程上调用NSOperationQueue?或者它是否在传递给它时所在的线程上被调用methodWithCompletionHandler:

-(void)methodWithCompletionHandler:(void (^)(NSString *message))handler
{
   // Note: We are currently on thread #1. Calling handler(@"my message") here
   //       will run on thread #1.

    NSBlockOperation* someOp = [NSBlockOperation blockOperationWithBlock: ^{

   // do some stuff
   }];

   [someOp setCompletionBlock:^{
      // Note: Now someOp is completing, but it's in thread #2. Does calling the handler
      //       as below also run in thread #2 or thread #1?
      handler(@"Some message.");
   }];

   NSOperationQueue *queue = [NSOperationQueue new];
   [queue addOperation:someOp];
}
4

2 回答 2

6

从文档中:

无法保证完成块的确切执行上下文,但通常是辅助线程。

http://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591-RH2-SW36

于 2013-02-21T22:41:53.870 回答
3

在您发布的示例中, someOp 中的块将在不同的线程上执行。

通常,块的行为就像一个常规函数。它们在调用它们的线程上运行(除非块本身做了一些事情来调用另一个线程等......)

于 2013-02-21T22:41:10.333 回答