2016-07-18 5 views
5

私のAPIリクエストにはPromiseKitを使用しています。Objc PromiseKit:約束の範囲内で新しい約束を追加

このシナリオでは、サーバーからオブジェクトIDのリストを取得しています。私は各IDの詳細を取得し、詳細の配列を返す必要があります。かなり一般的なシナリオ。

効果的には、FIRST約束に含まれるFORループ内から約束をチェーンに追加する必要があります。

私は右ドリフトを開始するコードを作成しましたが、チェーンは、約束の第2のチェーン(浅いモデル要求を満たす)が実行される前に完了します。

[PMKPromise promiseWithResolver:^(PMKResolver resolve) { 
    // Fetch an array of object IDs (shallow objects) 
    [APIManager fetchObjectListWithCompletion:^(NSArray *resultObjects, NSError *error) { 
     resolve(error ?: resultObjects[0]); 
    }]; 
}].then(^(NSArray *objects){ 
    // Fill each shallow object (query details) 
    PMKPromise *fetches = [PMKPromise promiseWithValue:nil]; 
    for(id model in objects) { 
     fetches.then(^{ 
      [APIManager fillShallowObject:model withCompletion:^(NSArray *resultObjects, NSError *error) { 
       // resolve? 
      }]; 
     }); 
    } 

    // Return promise that contains all fill requests 
    return fetches; 
})].then(^{ 
    // This should be executed after all fill requests complete 
    // Instead it's executed after the initial ID array request 
}); 

私が達成しようとしていることを行うには良い方法がありますか?おそらく、約束(。)を議決者に追加する方法でしょうか?

+0

です。私はPromiseKitを初めて使っていますが、それはあなたが必要としているようです。 – fishinear

答えて

2

は、私はあなたがwhenをしたいと思う:http://promisekit.org/when/:

[AnyPromise promiseWithAdapterBlock:^(id adapter) { 
    [APIManager fetchObjectListWithCompletion:adapter]; 
}].then(^(id objects){ 
    NSMutableArray *promises = [NSMutableArray new]; 
    for (id model in objects) { 
     id promise = [AnyPromise promiseWithAdapterBlock:^(id adapter){ 
      [APIManager fillShallowObject:model withCompletion:adapter]; 
     }]; 
     [promises addObject:promise]; 
    } 
    return PMKWhen(promises); 
}).then(^(NSArray *results){ 
    // when waits on all promises 
}); 

コードは 'とき' を見てくださいPromiseKit 3.

+0

どのようにエラーをキャッチしますか.iは迅速な意味を表します。[fulfill(dict)、reject(error)] – nova

+0

私はあなたの質問を理解していないので、ここで質問してみませんか:https://gitter.im/mxcl/PromiseKit – mxcl