Ios 如何等待任务完成,然后返回一个信号,如:
让我解释一下我想做什么Ios 如何等待任务完成,然后返回一个信号,如:,ios,objective-c,reactive-cocoa,racsignal,Ios,Objective C,Reactive Cocoa,Racsignal,让我解释一下我想做什么 我通过端点信号包装端点url 使用map提取url并执行服务调用(service([NSURL URLWithString:endPoint])) 使用map从步骤2中提取信息并创建info数据 使用回调执行updateVideoStateWith 返回包含结果的信号 最后,当我订阅finalPackage信号时,返回的是初始化值,即9。我意识到updateVideoStateWith回调将花费时间返回结果 我的问题是如何强制返回[RACSignal return:res
端点
信号包装端点urlmap
提取url并执行服务调用(service([NSURL URLWithString:endPoint])
)map
从步骤2中提取信息并创建info
数据updateVideoStateWith
结果的信号
finalPackage
信号时,返回的是初始化值,即9
。我意识到updateVideoStateWith
回调将花费时间返回结果
我的问题是如何强制
返回[RACSignal return:result]
等待,直到从回调块更新数据。我试过takeUntilBlock,但不知道如何使用它。我也考虑过使用switchToLatest,但仍然不走运。交叉发布我对GitHub问题的回答:
-(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;
}
-(RACSignal*)最终包装{
return[RACSignal createSignal:^(id订户){
RACSignal*endPointSignal=[[DGConfiguration sharedInstance].apiConfiguration urlTemplate:DGAPIRLocalWatchList];
[[endPointSignal映射:^id(NSString*端点){
//将端点映射到剧集并返回剧集数组
}]订阅文本:^(NSArray*集){
//创建初始结果数组
[[DGManager sharedInstance]updateVideoStateWith:info回调:^(NSArray*响应){
//对响应执行任何需要执行的操作以修改结果数组
[订阅方发送下一步:结果];
[用户发送完成];
}];
}错误:^(N错误*错误){
[订户发送错误:错误];
]];
返回零;
}];
}
注意:如果您在从端点NSString映射时返回RACSignal*,您将希望
展平映射
,而不是映射
,那么展平映射会将返回的信号展平为它发出的值。基本上您不想实际执行该操作,然后返回一个信号,您希望a返回一个将完成工作并在完成后发出结果。
- (RACSignal*)finalPackage {
return [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
RACSignal *endPointSignal = [[DGConfiguration sharedInstance].apiConfiguration urlTemplate:DGAPIUrlLocalWatchList];
[[endPointSignal map:^id(NSString *endPoint) {
// map your endpoints to episodes and return the array of episodes
}] subscribeNext:^(NSArray* episodes) {
// Create your initial result array
[[DGManager sharedInstance] updateVideoStateWith:info callback:^(NSArray *response) {
// Do whatever work you need to do with the response to modify the result array
[subscriber sendNext:result];
[subscriber sendComplete];
}];
} error:^(NSError* error) {
[subscriber sendError:error];
]];
return nil;
}];
}