2010-09-17 61 views
3

我需要檢測NSArray對象中的更改 - 也就是說,如果某個對象已添加到NSArray中/從NSArray中刪除或僅在原地進行了編輯。是否有一些集成的NSArray散列函數用於此任務 - 或者我需要爲NSArray編寫自己的散列函數?也許有人有不同的解決方案有任何想法嗎 ?在ObjC中檢測NSArray中的更改

回答

2

您可以使用NSArrayController,即Key-Value-Observing兼容。不幸的是NSArray只符合KVC標準。通過這種方式,您可以輕鬆監視陣列控制器的屬性arrangedObjects。這應該可以解決你的問題。

而且,看到了這個問題:Key-Value-Observing a to-many relationship in Cocoa

+5

雖然這不會告訴你一個對象是否在數組中發生了變異。你需要觀察數組中的每一個元素。 – Chuck 2010-09-17 18:43:51

5

所有的對象都有一個-hash方法,但不是所有的對象都具有良好的執行。

NSArray的文檔沒有定義它的結果,但測試顯示它返回數組的長度 - 不是非常有用:

NSLog(@"%lu", @[@"foo"].hash);    // output: 1 
NSLog(@"%lu", @[@"foo", @"bar"].hash);  // output: 2 
NSLog(@"%lu", @[@"hello", @"world"].hash); // output: 2 

如果性能並不重要,如果數組包含<NSCoding>對象則你可以簡單的數組序列化到NSData具有良好-hash實現:

[NSArchiver archivedDataWithRootObject:@[@"foo"]].hash    // 194519622 
[NSArchiver archivedDataWithRootObject:@[@"foo", @"bar"]].hash  // 123459814 
[NSArchiver archivedDataWithRootObject:@[@"hello", @"world"]].hash // 215474591 

爲了獲得更好的性能應該有一個答案的地方,說明如何編寫自己的-hash方法。基本上在數組中的每個對象上調用-hash(假設該數組包含可以可靠地進行散列的對象),並將每個對象混合在一起並使用一些簡單的隨機數學運算。