ReactiveCocoa:块永远不会执行

时间:2016-10-19 12:06:49

标签: objective-c reactive-cocoa

在我的应用中,我有一个下载管理器。任何任务完成后,我需要再次获取tableView的所有数据并重新加载它。但我无法在RACObserve信号中获取数据。这是我的代码。

NSArray *activeTasks = [[DownloadManager instance] tasksToProcess];
for (DownloadTask *task in activeTasks) {
        [[[self
        checkTask:task]
        map:^(id value
            return [self fetchDownloadedData];
        }]
        subscribeNext:^(NSArray *models) {
            // models returns RACDynamicSignal not NSArray
            NSLog(@"%@", models); // <RACDynamicSignal: 0x11611cb50> name:
            NSLog(@"checktask next");
        } completed:^{
            // This is never being executed
            NSLog(@"checktask completed");
        }];
}

- (RACSignal *)checkTask: (DownloadTask *)task {
    return [RACObserve(task, isFinished) map:^id(id _) {
        return nil;
    }];
}

- (RACSignal *)fetchDownloadedData {
     return [[MyCoreDataModel fetchAll] flattenMap:^id(NSArray *models) {
         // This is never being executed
         return [models filter:^BOOL(MyCoreDataModel *model) {
            return model.isDownloaded;
        }];
    }];
}

- (RACSignal *)fetchAll
{
    return [[[MyCoreDataModel findAll] sortBy:@"title"] fetch];
}

如果有人帮助我找到我的错误,那会很棒。提前谢谢。

1 个答案:

答案 0 :(得分:0)

错误很少:

  1. map函数中,您使用返回RACSignal的方法 - 它不正确。您应该使用flattenMap代替。
  2. 永远不会调用完整阻止,因为RACObserve - 热门信号,它只发送next事件。
  3. 我写了一个小例子,我希望它可以帮到你。

    NSMutableArray<RACSignal *> *signals = [NSMutableArray array];
    for (DownloadTask *task in activeTasks) {
        RACSignal *signal = [[RACObserve(task, isFinished) ignore:@NO] take:1];
        [signals addObject:signal];
    }
    
    @weakify(self);
    [[[RACSignal merge:signals] flattenMap:^RACStream *(id _) {
        @strongify(self);
        return [self fetchDownloadedData];
    }] subscribeNext:^(NSArray *models) {
    
    }];
    

    这里我创建了一系列信号。每个信号 - 观察isFinished属性。我还添加了ignore:@NO] take:1]; - 我认为它更正确,因为您只需要 YES 值,然后再观察不到(take:1)。然后我合并这些信号,每当有人发送完成状态时,我们就会获取数据。

    请告诉我,如果有什么不明白,我会尝试更清楚地解释。