-(RACSignal*)finalPackage {
RACSignal *endPoint = [[DGConfiguration sharedInstance].apiConfiguration
urlTemplate:DGAPIUrlLocalWatchList];` // 1.
return [[endPointRequestSignal map:^id(NSString *endPoint) { // 2.
return service([NSURL URLWithString: endPoint]);
}].flatten map:^id(NSArray *episodes) { // 3.
NSMutableArray *info= [NSMutableArray array];
__block NSArray *result=@[@(9)]; // test value is 9, result will be updated during callback block
[episodes enumerateObjectsUsingBlock:^(NSDictionary *item, NSUInteger idx, BOOL *stop) {
[info addObject:@{@"id":item[@"id"],@"links":item[@"links"]}];
}];
[[DGManager sharedInstance] updateVideoStateWith:info callback:^(NSArray *response) { // 4.
dispatch_async(dispatch_get_main_queue(), ^{
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
result = [[response sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]] copy];
});
}];
return [RACSignal return:result]; // 5.
}].flatten;
}
私がやろうとしていることを説明しましょう。
endPoint
シグナルを介してエンドポイントの URL をラップしますmap
URL を抽出してサービス コールを実行するために使用する (service([NSURL URLWithString: endPoint])
)map
ステップ 2 から情報を抽出してinfo
データを作成するために使用するupdateVideoStateWith
コールバックで行う- を含む信号を返します
result
最終的に、finalPackage
シグナルをサブスクライブすると、戻り値は初期化された値になります。コールバックが結果を返すのに時間がかかることが9
わかりました。updateVideoStateWith
私の質問はreturn [RACSignal return:result]
、コールバック ブロックからデータが更新されるまで強制的に待機させる方法です。takeUntilBlock を試してみましたが、使い方がわかりません。switchToLatest の使用も考えていますが、まだうまくいきません。