将NSArray与NSMutableArray进行比较,将delta对象添加到NSMutableArray

时间:2010-03-11 02:55:08

标签: objective-c cocoa compare nsmutablearray nsarray

我有一个NSMutableArray,其中填充了字符串对象。为简单起见,我们会说对象是一个人,每个人对象都包含有关该人的信息。

因此,我将拥有一个填充了person对象的NSMutableArray:

person.firstName
person.lastName
person.age
person.height

等等。

初始数据源来自Web服务器,并在我的应用程序加载时填充并完成它与服务器的初始化。我的应用程序会定期轮询服务器以获取最新的名称列表。

目前我正在创建NSArray结果集,清空NSMutableArray,然后在NSMutableArray结果{@ 1}}重新填充NSArray,然后销毁NSArray对象。

这对我来说在几个层面上看起来效率低下,并且还给我一个丢失表行参考的问题,我可以解决这个问题,但可能会为我自己创造更多的工作。

低效率似乎是我应该能够比较两个数组并最终得到过滤的NSArray。然后我可以将过滤后的集合添加到NSMutableArray。这意味着我可以简单地将新数据附加到NSMutableArray,而不是将所有内容丢弃并重新填充。

相反,我需要反向执行相同的过滤器,以查看是否有需要从NSMutableArray删除的记录。

有没有办法以更有效的方式做到这一点?我是否忽略了一些涉及更简单技术的文档中的某些内容?

当我清空NSMutableArray并重新填充时,我遇到了问题,因为任何引用表都会丢失其选定的行状态。我可以跟踪它并重新选择它,但我的理论是使用某种形式的比较和添加对象并删除对象而不是在一个块中处理整个数组可能意味着我保留我的行引用(假设该项目不是当然删除了。)

任何建议或帮助非常感谢。

更新

在我每次比较每个订单项时,快速枚举是否同样快?这似乎是一个昂贵的操作,但使用最后一个快速枚举代码,它可能非常有效......

解决方案

我最终选择了Abizem的建议。在处理大量数据集时,创建数组的可变副本和对象副本似乎比使用sbooth解决方案稍快一些。两者都很好用,我通过使用可变复制方法获得了更多优势。话虽如此,它确实让我的眼睛睁开了我以前没有看过的NSSet。

感谢您的反馈。

2 个答案:

答案 0 :(得分:11)

您可以使用NSSet轻松完成此类事情(假设您的人物对象是唯一的):

NSSet *existingItems = [NSSet setWithArray:existingItemArray];
NSSet *newItems = /* Get the new items from the server */

// Determine which items were removed
NSMutableSet *removedItems = [NSMutableSet setWithSet:existingItems];
[removedItems minusSet:newItems];

// Determine which items were added
NSMutableSet *addedItems = [NSMutableSet setWithSet:newItems];
[addedItems minusSet:existingItems];

// Modify the original array
[existingItemArray removeObjectsInArray:[removedItems allObjects]];
[existingItemArray addObjectsFromArray:[addedItems allObjects]];

如果性能不合适,我会感到惊讶,因为我确信实施已经过优化。

答案 1 :(得分:2)

两点。

  1. 新的NSArray包含您需要显示的所有数据。这就是为什么要在NSMutableArray中添加和删除以匹配新的。
  2. 您不希望丢失表格中所选行的状态。
  3. 这是我的建议

    1. 而不是清空NSMutableArray并使用新数组重新填充它;为什么不创建NSArray的mutableCopy并将其设置为新的NSMutableArray?
    2. 而不是担心项目的顺序(以及因此选择的行号);如何创建所选对象的副本,并在步骤1中创建新的NSMutableArray之后,在新数组中找到匹配的对象,并使用其新索引将其设置为表中的选定行。