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];
}
如果有人能帮助我找出我的错误所在,那就太好了。提前致谢。
错误很少:
- 在
map
函数中,您使用了 returns RACSignal
的方法 - 这是不正确的。您应该改用 flattenMap
。
- 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 状态时,我们获取数据。
如有不明白的地方请告诉我,我尽量解释清楚。
在我的应用程序中,我有一个下载管理器。完成任何任务后,我需要再次获取 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];
}
如果有人能帮助我找出我的错误所在,那就太好了。提前致谢。
错误很少:
- 在
map
函数中,您使用了 returnsRACSignal
的方法 - 这是不正确的。您应该改用flattenMap
。 - 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 状态时,我们获取数据。
如有不明白的地方请告诉我,我尽量解释清楚。