在Reactive Cocoa中解压缩数组

时间:2014-07-16 08:15:08

标签: objective-c functional-programming reactive-cocoa

我有一个看起来像这样的方法:

- (RACSignal*)savedObjectsOfEntityType:(NSEntityDescription*)entity
{
    return [[[[NSNotificationCenter defaultCenter] rac_addObserverForName:NSManagedObjectContextDidSaveNotification object:nil] map:^id(NSNotification *notification) {
        NSMutableArray *allSaves = [NSMutableArray array];
        [allSaves addObjectsFromArray:notification.userInfo[NSInsertedObjectsKey]];
        [allSaves addObjectsFromArray:notification.userInfo[NSUpdatedObjectsKey]];
        [allSaves addObjectsFromArray:notification.userInfo[NSDeletedObjectsKey]];
        return allSaves;
    }] filter:^BOOL(NSArray *allSaves) {
        // Can filter only if I get individual objects
    }];
}

我正在映射通知中心上观察者返回的通知对象。每个通知都包含几个我在allSaves数组中合并在一起的数组。在下一步中,我需要过滤该数组中的各个对象。问题是我从地图中得到的对象是对象数组,对它进行过滤是没有意义的。相反,我需要地图逐个发送allSaves中的对象。 map运算符不会这样做,但是有另一个运算符可以接受一个数组并逐个传递出来的单个对象吗?

1 个答案:

答案 0 :(得分:1)

RACSignal *saves = [[NSNotificationCenter defaultCenter] rac_addObserverForName:NSManagedObjectContextDidSaveNotification object:nil]; // you should include the managed object context you want to watch here, but that's a separate issue
return [[[saves map:^(NSNotification *notification) {
    NSMutableArray *allSaves = [NSMutableArray array];
    [allSaves addObjectsFromArray:notification.userInfo[NSInsertedObjectsKey]];
    [allSaves addObjectsFromArray:notification.userInfo[NSUpdatedObjectsKey]];
    [allSaves addObjectsFromArray:notification.userInfo[NSDeletedObjectsKey]];
    return [[allSaves rac_sequence] signal];
}] switchToLatest] filter:^BOOL(NSManagedObject *savedObject) {

}];

我们将对象数组allSaves转换为RACSequence。然后我们将RACSequence转换为RACSignal并返回(没有办法直接从数组转到AFAIK信号)。所以我们正在映射"保存信号"进入"在特定步骤中保存的对象的信号"。

switchToLatest接收第二个信号并订阅它,以便下一个filter,而不是接收保存对象的#34;信号,接收每个&#34;保存的对象&#34;从概念上讲,switchToLatestSignal<Signal<T>>变为Signal<T>。所以我们就像解开内在的信号一样。

我们可以通过flattenMap代替map / switchToLatest来实现此目标。我相信在这种情况下它的行为相同,因为内部信号是有限的并且很快就会完成,所以你可以用这种方式保存自己的几个字符。但请检查我是否是第一个。