OperationPromiseはNSOperationQueueの面倒な依存関係の記述をそのまま実行される順番に並べて書けるライブラリです。

pod 'OperationPromise'

でインストールできます。

NSOperationの依存関係は、NSOprationごとにaddDependency:で自身が依存してるものを記述しないと行けない直感的では無いですし面倒です。

OperationPromiseを使った場合 1->2->3と実行したい場合は以下のように、

.then

でつなげるだけで書けるようになります。

NSMutableArray *race = [NSMutableArray array];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@1];
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@2];
}];
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@3];
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[OperationPromise promise:queue]
    .then(blockOperation1)
    .then(blockOperation2)
    .then(blockOperation3)
    .start();
[queue waitUntilAllOperationsAreFinished];// sync wait....
NSArray *expect = @[@1, @2, @3];
XCTAssertEqualObjects(race, expect);
// Call @1 -> @2 -> @3

また同じように、 1-> 2と3は並行 -> 4 というように実行したい場合は

.when

をメソッドチェーンに使って以下のように書けます。

NSMutableArray *race = [NSMutableArray array];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@1];
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@2];
}];
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@3];
}];
NSBlockOperation *blockOperation4 = [NSBlockOperation blockOperationWithBlock:^{
    [race addObject:@4];
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[OperationPromise promise:queue]
    .then(blockOperation1)
    .when(@[blockOperation2, blockOperation3])
    .then(blockOperation4)
    .start();
[queue waitUntilAllOperationsAreFinished];// wait perform all operation...

NSArray *expect = @[@1, @2, @3, @4];
XCTAssertEqualObjects(race[0], expect[0]);
XCTAssertEqualObjects(race[3], expect[3]);
// call @1 -> (@2 or @3) -> @4

2と3はどちらが先に実行されるかは、NSOperationQueueの設定しだいです。

OperationPromiseを使うと面倒なNSOperation同士の依存関係をシンプルにメソッドチェーンを使って書けるようになります。(またソースもシンプルです)

Post Navigation