2010-03-11 90 views
2

我有一个填充了字符串对象的NSMutableArray。为了简单起见,我们会说对象是一个人,每个人对象都包含有关该人的信息。NSArray的比较与NSMutableArray中添加三角洲对象的NSMutableArray

因此我会被填充了人的对象一个NSMutableArray:

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

等。

数据的最初来源是一个网络服务器,当填充我的应用程序加载并完成它的初始化与服务器。我的应用程序定期轮询服务器以获取最新的名称列表。

目前我创建的结果集的NSArray,排空NSMutableArray,然后重新填充销毁NSArray对象之前的NSMutableArrayNSArray结果。

这似乎效率不高我上了几级,并且还送给我一个问题,失去了表行的引用,我可以解决,但这样做可能会创造更多的工作,为自己。

的效率似乎是我应该能够比较两个阵列和一个过滤NSArray结束。然后我可以将过滤后的集合添加到NSMutableArray。这意味着我可以简单地将新数据附加到NSMutableArray而不是将所有内容全部丢出并重新填充。

相反,如果有需要从NSMutableArray删除记录我需要做反向相同的过滤器看到的。

是否有任何方法可以以更高效的方式执行此操作?我是否忽略了文档中的某些地方提到了一种更简单的技术?

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

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

更新

难道是一样快做一个快速列举了每一个比较,因为我去的每个项目?这似乎是一个昂贵的操作,但与上次快速列举代码,它可能是相当有效...

解决方案

我结束了Abizem的建议下去。在处理大量数据时,创建数组的可变副本和对象的副本似乎比使用sooth的解决方案稍快一些。两者都工作得很好,我通过使用可变副本方法获得了更多优势。话虽如此,但它确实让我的眼睛看到了NSSet,而我之前从未看过。

感谢您的反馈意见。

+2

为什么不测试它,看看?不要过早地优化。 – 2010-03-11 05:08:21

+0

在这个过程中:-)我会更新我的发现*但*如果有人已经这样做,并知道......好吧...... :-) – Hooligancat 2010-03-11 05:11:50

回答

2

两点。

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

我这里还有我的建议

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

Abizem ...就像这样。至少这样我不需要比较每个数组中的每个项目。即使我拿着'NSSet'方向,sbooth建议它仍在做比较。这种方法意味着我只需要设置一次所选择的索引并繁荣完成。 我会实施每一个,看看我是否得到一个视觉/性能差异使用之一。 – Hooligancat 2010-03-11 19:46:25

+0

Hooligancat ...另外,如果您正在进行任何比较对象平等的比较,请务必为您的对象类编写一个“isEqualTo:”方法。例如'NSString'有'isEqualToString'方法,它确保字符串值是相同的,而不是看到'NSString *'指针是相同的。 – Abizern 2010-03-11 21:02:22

+0

Abizem好点。谢谢 – Hooligancat 2010-03-12 19:00:04

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]]; 

我会感到惊讶,如果表现不正经,我敢肯定,实施得到优化。

+0

感谢您的建议sbooth。我没有考虑过使用NSSet,但是这种方法更有效。我可能拥有大量的数据,所以我获得的所有提高效率都会有所帮助。 – Hooligancat 2010-03-11 19:44:36

+0

虽然我没有问这个问题,但这完全是我在最后一天半的时间里所做的,绝对没有运气。这是一段优雅的代码,我立即意识到这是我所需要的。非常感谢,在我刚把笔记本电脑扔出窗外的瞬间,这真是天赐之物! :D – 2011-01-13 02:58:49

+0

这是一流的!是否有一种简单的方法可以获得未添加或删除项目的NSSet(即相同)。通过这种方式,我可以循环并执行一些操作。我想我正在寻找第三个数组/集,其中包含“重复” – 2011-08-17 08:05:04