簡體   English   中英

[moc保存] PerformBlockAndWait之后,為什么我的NSManagedObject不存在?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM