如何使用RXCollections展平嵌套的NSArray

时间:2013-10-09 23:26:41

标签: objective-c cocoa collections

我对包含阵列的NSArray进行展平的典型模式如下:

NSMutableArray *flattenedArray = [NSMutableArray array];
for (NSArray *innerObjects in arrayToFlatten) {
    [flattenedArray addObjectsFromArray:innerObjects];
}

(或者我使用@unionOfArrays KVC集合运算符)。

使用RXCollections的最佳等价物是什么?我有:

NSArray *flattenedArray = RXConstructArray(RXFold(arrayToFlatten, [NSMutableArray array], ^id(id memo, id each,
    bool *stop) {
    NSMutableArray *accumulator = memo;
    [accumulator addObjectsFromArray:each];
    return accumulator;
}));

但是使用NSMutableArray累加器对我来说有些不协调。


我已经离开了上面的原文,以免弄错Rob的回答,但(迄今为止)改进的版本是:

NSArray *flattenedArray = RXFold(arrayToFlatten, [NSMutableArray array], ^id(NSMutableArray *accumulator, NSArray *array,
    bool *stop) {
    [accumulator addObjectsFromArray:array];
    return accumulator;
});

1 个答案:

答案 0 :(得分:2)

当使用它或任何其他抽象时,我发现它有助于我思考过程的结构。从语义上讲,将数组数组展平为单个数组是一种折叠;所以这段代码直接实现了。 (旁白:您知道吗,您只需将备忘录键入NSMutableArray *而不是id,而不是进行临时分配?胜利的协方差!)

另一方面,如果你更关心按顺序遍历嵌套数组中的对象而不是结果数组,那么你真正想要的是一个遍历每个包含数组的遍历。

此时你可以将它折叠成一个RXConstructArray()的数组,但是如果你不需要产生最终的数组值,你就会有一个纯粹的延迟过程。

关于此的两点说明:

  1. RXConstructArray()返回一个延迟填充的数组,类似于Core Data提取的fetchBatchSize设置工作方式。

  2. 您对RXFold()的使用实际上并不需要RXConstructArray(),因为它正在返回由对块的最终评估产生的备忘录,而不是遍历。在技​​术细节中,这是因为RXFold()严格评估,而不是懒惰;然而,ObjC中的懒惰折叠功能听起来像是一个有趣的项目!