0

仍在使用我的RSS閱讀器。爲什麼我的NSManagedObject在[moc保存] PerformBlockAndWait後沒有保存?

我的數據模型大致由以下NSManagedObject層次:

Category <---->> Feed <---->> Post 

我的應用程序使用以下:

  • 「根」 NSManagedObjectContextNSPrivateQueueConcurrencyType併發類型。我使用這個MOC來堅持我對NSPersistentStoreCoordinator的更改。

  • 「主」NSManagedObjectContextNSMainQueueConcurrencyType併發類型。我使用這個MOC來提供我的GUI。

  • 「本地」NSManagedObjectContextNSPrivateQueueConcurrencyType併發類型。每次我批量提取新的Posts對象時,我都會創建並使用這個MOC。

一旦載入MainViewController,它會自行填充(如果爲空)。

populate方法的末尾,我要確保一切都正常持續存在,也重新獲取我的數據:

[_mainMOC performBlockAndWait:^{ 
    NSError *error; 
    if (![_mainMOC save:&error]) { 
     NSLog(@"[MainViewController::populate] Error.mainMOC: %@\n%@", [error description], [error userInfo]); 

    } 
    [[_mainMOC parentContext] performBlockAndWait:^{ 
     NSError *error; 
     if (![[_mainMOC parentContext] save:&error]) { 
      NSLog(@"[MainViewController::populate] Error.saveMOC: %@\n%@", [error description], [error userInfo]); 

     } 
    }]; 
    NSLog(@"[MainViewController::populate] OK.saveMOC"); 
}]; 
NSLog(@"[MainViewController::populate] OK.mainMOC"); 
[_mainMOC performBlock:^{ 
    NSError *error; 
    if (![_mainMOC executeFetchRequest:[_fetchedResultsController fetchRequest] error:&error]) { 
     NSLog(@"[MainViewController::populate] refetch: %@\n%@", [error description], [error userInfo]); 

    } 
}]; 

儘管這樣,在一個專用的`我無法將Feed秒鐘內創建Post小號localMOC`` :

NSManagedObjectID *feedID=[f objectID]; 
if ([feedID isTemporaryID]) { 
    NSLog(@"Warning %@ has not yet been persisted!", f.name); 
} 
/* ... */ 
NSManagedObjectContext *localMOC; 
localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[localMOC setParentContext:self.mainMOC]; 
/* ... */ 
[localMOC performBlock:^{ 
    NSError *error=nil; 
    Feed *feed=((Feed *)[localMOC existingObjectWithID:feedID error:&error]); 
    if (error) { 
     NSLog(@"[MAsterViewController::fetchPosts] %@\n%@", [error localizedDescription], [error userInfo]); 
     return; 
    } 
/* ... */ 

上面的代碼位生成以下日誌:

2013-11-14 19:24:04.847 uRSS[10907:70b] Warning Maddox has not yet been persisted! 
2013-11-14 19:24:04.847 uRSS[10907:1303] [MAsterViewController::fetchPosts] The operation couldn’t be completed. (Cocoa error 133000.) 

有人能告訴我這裏有什麼問題嗎? 謝謝!

回答

0

我終於解決了我的問題,通過實現我自己保存例行:

[_localMOC performBlockAndWait:^{ 
    NSError *errLoc=nil; 

    if (![self.mainMOC obtainPermanentIDsForObjects:@[[[_mainMOC insertedObjects]  arrayByAddingObjectsFromArray:[_mainMOC updatedObjects]]] error:&errLoc]) { 
    NSLog(@" ... "); 
    } 

    if (![_localMOC save:&errLoc]) { 
     NSLog(@" ... "); 
    } 
    [_mainMOC performBlockAndWait:^{ 
     NSError *errMain=nil; 
     if (![_mainMOC save:&errMain]) { 
      NSLog(@" ... "); 
     } 
    }] 
}]; 

注意_mainMOC正在從AppDelegate觀察都會有變化異步地被他的父母_saveMOC保存到磁盤。

1

如果沒有某種保存/更改操作發生,一個上下文無法訪問另一個上下文「臨時」(未保存的)對象。

上下文是一個暫存器,它獨自擁有其更改,直到它決定通過提交保存操作(您還可以偵聽上下文更改通知)共享它們。

你的情況:
main環境中創建一個項目(local方面存在之前)。
然後,您嘗試從local上下文訪問此項目,而不先保留對象(或獲取永久ID)。

爲了實現這種流動的,你將需要至少獲得一個永久編號爲你反對:[self.mainMOC obtainPermanentIDsForObjects:@[f] error:&error]

注:
儘管main MOC作爲local的父上下文中,使用local上下文的existingObjectWithID:error:方法將僅查找local上下文的已註冊對象中的對象。否則,它會嘗試從商店中取貨。獲取永久ID將導致local上下文嘗試訪問存儲(或父上下文)以獲取對象。

+0

你好,*非常感謝您的幫助。所以我想我的多個''performBlockAndWait ... save''塊沒有任何作用? – mirx

+1

由於'local'上下文沒有保存,並且無法更改對象,所以沒有。但對「main」上下文所做的所有更改都將保留。 –

相關問題