[英]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]];
如果性能不合適,我會感到驚訝,因為我確信實現已經過優化。
兩點。
這是我的建議
mutableCopy
並將其設置為新的NSMutableArray?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.