簡體   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