繁体   English   中英

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

[英]Compare NSArray with NSMutableArray adding delta objects to NSMutableArray

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

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

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

等等。

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

目前我正在创建结果集的NSArray ,清空NSMutableArray ,然后在销毁NSArray对象之前使用NSArray结果重新填充NSMutableArray

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

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

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

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

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

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

更新

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

我最终选择了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]];

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

两点。

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

这是我的建议

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM