我有一个NSMutableArray
,其中填充了字符串对象。为了简单起见,我们会说对象是一个人,每个人对象都包含有关该人的信息。
因此,我将拥有一个填充有 person 对象的 NSMutableArray:
person.firstName
person.lastName
person.age
person.height
等等。
初始数据源来自 Web 服务器,并在我的应用程序加载并完成服务器初始化时填充。我的应用程序定期轮询服务器以获取最新的名称列表。
目前,我正在创建结果集的 NSArray
,清空 NSMutableArray
,然后用 NSArray 重新填充
销毁 NSMutableArray
NSArray
对象之前的结果。
这在某些层面上对我来说似乎效率低下,并且还给我带来了丢失表行引用的问题,我可以解决这个问题,但这样做可能会为自己创造更多的工作。
效率低下似乎是我应该能够比较两个数组并最终得到过滤后的NSArray
。然后我可以将过滤后的集合添加到 NSMutableArray 中。这意味着我可以简单地将新数据附加到 NSMutableArray 中,而不是扔掉所有内容并重新填充。
相反,我需要反向执行相同的过滤器,以查看是否有需要从 NSMutableArray
中删除的记录。
有什么方法可以更有效地做到这一点吗?我是否忽略了文档中某些地方涉及更简单技术的内容?
当我清空 NSMutableArray 并重新填充时遇到问题,因为任何引用表都会丢失其选定的行状态。我可以跟踪它并重新选择它,但我的理论是,使用某种形式的比较、添加对象和删除对象,而不是在一个 block 中处理整个数组可能意味着我保留我的行引用(假设该项目不是当然删除了)。
非常感谢任何建议或帮助。
更新
对每个比较每个行项目进行快速枚举是否和我一样快?这似乎是一个昂贵的操作,但使用最后的快速枚举代码可能会非常有效......
解决方案
我最终同意了 Abizem 的建议。在处理大量数据时,创建数组的可变副本和对象的副本似乎比使用 sbooth 的解决方案稍快一些。两者都工作得很好,我只是通过使用可变复制方法获得了更多优势。话虽这么说,它确实让我看到了 NSSet,这是我以前没有看过的。
感谢您的反馈。
最佳答案
您可以使用 NSSet 轻松完成此类操作(假设您的 person 对象是唯一的):
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]];
如果性能不佳,我会感到惊讶,因为我确信实现已经过优化。
关于objective-c - 将 NSArray 与 NSMutableArray 进行比较,将 delta 对象添加到 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422214/