0

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/waitUntilAllOperationsAreFinishedのこのメソッドの説明は次のとおりです。

このメソッドが呼び出されると、現在のスレッドがブロックされ、レシーバーの現在のキューに入れられた操作が実行を終了するのを待ちます。現在のスレッドがブロックされている間、レシーバーはすでにキューに入れられている操作を開始し、実行中の操作を監視し続けます。この間、現在のスレッドはキューに操作を追加できませんが、他のスレッドは追加できます。保留中のすべての操作が終了すると、このメソッドは戻ります。

そのような動作を可能にするwaitUntilAllOperationsAreFinishedの背後にあるコードは何ですか(現在のスレッドをブロックし、レシーバーは続行します...)?私は同様の動作を生成するコードを書くことに興味があるので、同様の動作をする同等の(ええ、Appleは私にとってブラックボックス化されています)コードに感謝します。

より具体的には、NSOperationQueueはどのようにスレッドをブロックし、同時にレシーバーがその処理を実行できるようにしますか(私の推測:currentRunLoopの実行中にセマフォをディスパッチします)?

ありがとう!

4

2 に答える 2

2

あなたが言ったように、実装は不明です。しかし、その動作を実現するのは簡単です。

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

_dispatchOperation次に、キューによって管理されるワーカースレッドによってトリガーされるセマフォをブロックします。それらの1つが信号を送ると、キューから次の操作をディスパッチします。

于 2012-11-28T19:23:37.363 に答える
1

偶然にも、私はこれを見つけました: NSOperation 内に NSRunLoop を実装する方法 、ここで尋ねたのとまったく同じ質問に対処します:

私の別のSOトピックとペアになりました: 「ブロック」メインスレッド(dispatch_get_main_queue())および(またはしない) currentRunLoopを定期的に実行します-違いは何ですか? 、それは私の質問に答えます。

LATER UPDATE: 私の質問にも部分的に関連する興味深いソース コード: https://github.com/gnustep/gnustep-base/blob/master/Source/NSOperation.m

于 2012-11-30T03:06:24.490 に答える