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

让我解释一下我想做什么

  • 我通过
    端点
    信号包装端点url
  • 使用
    map
    提取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;
            }];
    }