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 に答える