【问题标题】:ReactiveCocoa: block is never executedReactiveCocoa:块永远不会执行
【发布时间】:2016-10-19 12:06:49
【问题描述】:

在我的应用程序中,我有一个下载管理器。完成任何任务后,我需要再次获取 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];
}

如果有人帮助我找出我的错误在哪里,那就太好了。提前致谢。

【问题讨论】:

    标签: objective-c reactive-cocoa


    【解决方案1】:

    有几个错误:

    1. 在map 函数中,您使用的方法返回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 状态时,我们都会获取数据。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-23
      • 2019-12-07
      • 2020-01-23
      • 1970-01-01
      • 2021-08-19
      • 2012-05-30
      • 2016-06-30
      相关资源
      最近更新 更多