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

标签 objective-c cocoa compare nsmutablearray nsarray

我有一个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/

相关文章:

ios - 在填充静态 TableView 之前等待 HTTP Web 请求完成

ios - 如何在编辑模式下调整 UITableViewCell 背景的大小

linux - 使用 awk 命令比较 2 个文件的算术

iphone - 真正的 iPhone 设备上有类似 'getStreamsToHost' 的东西吗?

ios - 带 token 身份验证的 NSURLSession

objective-c - 如何使用 Cocoa 压缩 PNG 图像?

objective-c - 捕获所有 Wi-fi 网络并保存到列表中

objective-c - 从字典数组中,创建包含一个键值的数组

javascript - 在 JavaScript 中比较两个图像

c++ - 为什么标准字符串函数比我的自定义字符串函数更快?