-(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
我通过信号包装 endPoint url- 用于提取url
map
并进行服务调用 (service([NSURL URLWithString: endPoint])
) - 用于
map
从步骤 2 中提取信息并创建info
数据 updateVideoStateWith
使用回调- 返回一个包含的信号
result
最终,当我订阅finalPackage
信号时,返回值是初始化值9
。我意识到updateVideoStateWith
回调将需要时间来返回结果。
我的问题是如何强制return [RACSignal return:result]
等到数据从回调块更新。我确实尝试过 takeUntilBlock 但不知道如何使用它。我也考虑使用 switchToLatest 但仍然没有运气。