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