2011-05-10 96 views
0

我有一個窗口,其中包含一個包含核心數據對象的列表,以及一個顯示窗口,當您選擇一個窗口時會打開。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的託管對象上下文綁定到我的應用程序委託的屬性,該屬性返回其他所有使用的相同上下文。我在這個問題上很努力地抓我的頭。

回答

2

請記住,當您正在處理項目時,您的managedObjectContext充當便箋。在您實際保存託管對象上下文之前,您對託管對象的更改不會反映到數據庫中。

因此,在將項目標記爲已讀或未讀之後,您需要保存上下文。

NSError *saveContextError=nil; 
if (![yourManagedObjectContext save:&saveContextError){ 
    // Handle the error 
    NSLog(@"managedObjectContext save error: %@",error); 
} 
+0

不幸的是,這不是它 - 我保存任何時間進行更改。 – 2011-05-19 18:48:51

+0

我接受這是正確的,因爲它足夠接近 - 事實證明,我正在處理不同的託管對象上下文,出於某種原因,儘管應用程序委託返回相同的對象。仍然非常不穩定,但它似乎現在工作。 – 2011-05-19 23:02:08

相關問題