ReactiveCocoa:永远不会执行块

ReactiveCocoa: block is never executed

在我的应用程序中,我有一个下载管理器。完成任何任务后,我需要再次获取 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. map 函数中,您使用了 returns RACSignal 的方法 - 这是不正确的。您应该改用 flattenMap
  2. Complete 块永远不会被调用,因为 RACObserve - 热信号,它只发送 next 事件。

我写了一个小例子,希望对你有帮助。

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)。然后我合并这些信号,每次当其中有人发送 finished 状态时,我们获取数据。

如有不明白的地方请告诉我,我尽量解释清楚。