我有一個窗口,其中包含一個包含核心數據對象的列表,以及一個顯示窗口,當您選擇一個窗口時會打開。NSArrayController和核心數據不像預期的那樣運行
顯示窗口中的某個動作將核心數據對象標記爲「讀取」。
要打開一個對象,我將該對象傳遞給顯示窗口,以及顯示該列表的sortDescriptors和filterPredicate,以便顯示窗口可以向前/向後導航(主窗口有時會顯示一個對象的子集,這就是爲什麼我需要sortDescriptors和filterPredicate)。
將打開的對象標記爲已讀完美。由於KVO,它會自動在主窗口中更新。
但是,當我向前/向後導航到顯示窗口中的其他對象時,標記爲已讀不再有效。我遍歷代碼並看到代碼執行,檢查新值,並將其標記爲已讀 - 但這並不反映在主窗口或數據庫中。
有沒有什麼明顯的可能導致這個?我不是在任何時候創建核心數據對象的副本。顯示窗口使用NSArrayController來獲取數據,並將sortDescriptors和filterPredicate應用於它。我的代碼,以獲得下一個對象是這樣的:
-(MyObject *object)nextObject {
// _object is the object being displayed by the display window.
// _listContainingObject is an NSArrayController set to Entity: Object
NSArray *list = [_listContainingObject arrangedObjects];
NSUInteger positionInList = 0;
for (MyObject *object in list) {
if ([[[object objectID] URIRepresentation] isEqualTo: [[_object objectID] URIRepresentation]]) { break;
}
positionInList++;
}
if (positionInList == [list count] - 1) return nil;
if (positionInList + 1 > [list count] - 1) return nil;
MyObject *object = [list objectAtIndex: positionInList + 1];
return object;
}
這真的好像我遇到了核心數據的一些隱藏的疑難雜症,如物體拉出一個不同的NSArrayController的都是複印件......但一切都運行關閉相同的ManagedObjectContext。 NSArrayController的託管對象上下文綁定到我的應用程序委託的屬性,該屬性返回其他所有使用的相同上下文。我在這個問題上很努力地抓我的頭。
不幸的是,這不是它 - 我保存任何時間進行更改。 – 2011-05-19 18:48:51
我接受這是正確的,因爲它足夠接近 - 事實證明,我正在處理不同的託管對象上下文,出於某種原因,儘管應用程序委託返回相同的對象。仍然非常不穩定,但它似乎現在工作。 – 2011-05-19 23:02:08