私は、メインプロジェクトでそれらを使用する前に、その仮定NSOperation
をテストするテストプロジェクトを作成しました。NSOperationQueue
私のコードは非常に単純なので、ここにすべてを含めます。これは、ARCがオンになっているコマンドラインFoundationプロジェクトを使用しています。
Operation.h
#import <Foundation/Foundation.h>
@interface Operation : NSOperation
@property (readwrite, strong) NSString *label;
- (id)initWithLabel: (NSString *)label;
@end
Operation.m
#import "Operation.h"
@implementation Operation
- (void)main
{
NSLog( @"Operation %@", _label);
}
- (id)initWithLabel: (NSString *)label
{
if (( self = [super init] )) {
_label = label;
}
return self;
}
@end
Main.m
#import <Foundation/Foundation.h>
#import "Operation.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;
id create = [[Operation alloc] initWithLabel: @"create"];
id update1 = [[Operation alloc] initWithLabel: @"update1"];
id update2 = [[Operation alloc] initWithLabel: @"update2"];
[update1 addDependency: create];
[update2 addDependency: create];
[queue addOperation: update1];
[queue addOperation: create];
[queue addOperation: update2];
[queue waitUntilAllOperationsAreFinished];
}
return 0;
}
私の出力は次のようになります。
2012-05-02 11:37:08.573 QueueTest[1574:1b03] Operation create
2012-05-02 11:37:08.584 QueueTest[1574:1903] Operation update2
2012-05-02 11:37:08.586 QueueTest[1574:1b03] Operation update1
これを書き、いくつかの組み合わせを試してみたところ、次のようにキューの設定を並べ替えると、次のようになりました。
[queue addOperation: update1];
[queue addOperation: create];
[queue addOperation: update2];
[update1 addDependency: create];
[update2 addDependency: create];
[queue waitUntilAllOperationsAreFinished];
私は同じ出力を得ました:
2012-05-02 11:38:23.965 QueueTest[1591:1b03] Operation create
2012-05-02 11:38:23.975 QueueTest[1591:1b03] Operation update1
2012-05-02 11:38:23.978 QueueTest[1591:1903] Operation update2
一部の実行で、update2がupdate1の前に実行されることがわかりましたが、その動作は驚くべきことではありません。NSOperationQueue
私がそうするように頼んでいないのに、なぜ決定論的でなければならないのですか?
私が驚いたのは、依存関係が追加される前にすべてがキューに追加されたとしても、どういうわけかcreateはupdate1とupdate2の前に常に実行されるということです。
明らかに、これはばかげたことですが、私は疑問に思いました。キューに操作を追加してから実行されるまでの遅延は文書化されていますか、それとも何らかの形で予測可能ですか?NSOperationQueue
追加された操作の処理を開始するのはいつですか?
本当に、最も重要なのは、正確に何が待っているのか、そしていつその待機が私を防御できないNSOperationQueue
何らかの方法で私を噛むのでしょうか?