在我的应用中,我有一个下载管理器。任何任务完成后,我需要再次获取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];
}
如果有人帮助我找到我的错误,那会很棒。提前谢谢。
答案 0 :(得分:0)
错误很少:
map
函数中,您使用返回RACSignal
的方法 - 它不正确。您应该使用flattenMap
代替。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
)。然后我合并这些信号,每当有人发送完成状态时,我们就会获取数据。
请告诉我,如果有什么不明白,我会尝试更清楚地解释。