![](/img/trans.png)
[英]Why does RestKit save all NSManagedObjectContexts via performBlockAndWait?
[英]Why aren't my NSManagedObject persisted after a [moc save] PerformBlockAndWait?
仍在我的RSS閱讀器上工作。
我的數據模型大致由以下NSManagedObject
層次結構組成:
Category <---->> Feed <---->> Post
我的應用程序使用以下內容:
具有NSPrivateQueueConcurrencyType
並發類型的“根” NSManagedObjectContext
。 我使用此MOC來保存對NSPersistentStoreCoordinator
更改。
具有NSMainQueueConcurrencyType
並發類型的“主” NSManagedObjectContext
。 我使用此MOC來填充我的GUI。
具有NSPrivateQueueConcurrencyType
並發類型的“本地” NSManagedObjectContext
。 每當我批量獲取新的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]);
}
}];
盡管如此,我仍無法在專用的“ localMOC”中的Feed
創建Post
:
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.)
有人可以告訴我這是怎么回事嗎? 謝謝!
如果沒有某種保存/更改操作,則一個上下文無法訪問另一個上下文“臨時”(未保存)對象。
上下文是暫存器,僅擁有其更改,直到它決定通過提交保存操作來共享它們為止(您也可以偵聽上下文更改通知)。
在您的情況下:
main
上下文創建了一個項目(在local
上下文存在之前)。
然后,您嘗試從local
上下文訪問此項目,而無需首先持久化對象(或獲取永久性ID)。
為了完成這種流程,您將至少需要為您的對象獲取一個永久性ID: [self.mainMOC obtainPermanentIDsForObjects:@[f] error:&error]
注意:
盡管main
MOC作為母公司local
背景下,使用existingObjectWithID:error:
該方法local
背景下將只尋找在已注冊的對象的對象local
環境。 否則,它將嘗試從商店中獲取。 獲取永久性ID將導致local
上下文嘗試訪問商店(或父上下文)以獲取對象。
我終於通過實現自己的保存例程解決了我的問題:
[_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(@" ... ");
}
}]
}];
請注意,正在從AppDelegate
中觀察到_mainMOC
,並且其_saveMOC
父級會將其更改異步保存到磁盤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.