2014-02-28 56 views
0

我已經設置了兩個NSManagedObjectContexts,一個在主線程上,另一個在後臺線程上。我目前正在嘗試實現一個NSFetchedResultsController,但似乎主線程的保存通知不包含像它爲後臺線程所做的更改。核心數據管理對象上下文保存

有關如何解決此問題的任何想法?以下是通知的樣子(後臺先保存記錄,然後保存主保存)。

2014-02-28 15:14:24.210 Lift[62931:70b] Notification found with: 
    name:  NSManagingContextDidSaveChangesNotification 
    object: <NSManagedObjectContext: 0x109280700> 
    userInfo: { 
    inserted = "{(\n)}"; 
    updated = "{(\n <Message: 0x109622cc0> (entity: Message; id: 0xd000000000a40006 <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/Message/p41> ; data: {\n \"awaiting_reply\" = 0;\n \"body_excerpt\" = \"\\n\\nOn Friday, February 28, 2014 at 12:17 AM, Cody Robertson wrote:\\n\\n> \\n> \\n> On Friday, February 28, 2014 at 12:16 AM, Cody Robertson wrote:\\n> \\n> > \\n> > \\n> > On Friday, February 28, 2014 at 12:12 AM, Co\";\n cc = \"<relationship fault: 0x109302a10 'cc'>\";\n date = \"2014-02-28 05:19:19 +0000\";\n \"expiration_date\" = nil;\n \"expiration_length\" = 259200;\n folder = \"lift:in\";\n from = \"0xd0000000000c0008 <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/UserInfo/p3>\";\n id = 53101bd032ef5519958b4ecb;\n mailbox = \"0xd000000000040000 <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/Mailbox/p1>\";\n read = 0;\n subject = \"Re: A New Email!\";\n thread = \"0xd00000000060000a <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/Thread/p24>\";\n to = \"<relationship fault: 0x1093002a0 'to'>\";\n}),\n <Message: 0x10975bfd0> (entity: Message; id: 0xd000000000b80006 <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/Message/p46> ; data: {\n \"awaiting_reply\" = 0;\n \"body_excerpt\" = \"\\n\";\n cc = \"<relationship fault: 0x109760580 'cc'>\";\n date = \"2014-02-28 18:33:25 +0000\";\n \"expiration_date\" = nil;\n \"expiration_length\" = 259200;\n folder = \"lift:in\";\n from = \"0xd0000000000c0008 <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/UserInfo/p3>\";\n id = 5310d5eb32ef5519958b4fa7;\n mailbox = \"0xd000000000040000 <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/Mailbox/p1>\";\n read = 0;\n subject = \"New Message\";\n thread = \"0xd0000000007c000a <x-coredata://B1800ECF-053B-417C-81C0-CD304EF83F19/Thread/p31>\";\n to = \"<relationship fault: 0x10975e910 'to'>\";\n}),\n )}"; 
} 
2014-02-28 15:14:24.228 Lift[62931:70b] Notification found with: 
    name:  NSManagingContextDidSaveChangesNotification 
    object: <NSManagedObjectContext: 0x10927f670> 
    userInfo: { 
    inserted = "{(\n)}"; 
    updated = "{(\n)}"; 
} 

這是我如何保存從後臺我的上下文:

- (void)saveFromBackgroundThread:(void(^)(void))completionBlock 
{ 
    NSError *error; 
    if (![_backgroundManagedObjectContext save:&error]) 
    { 
     NSLog(@"[BACKGROUND_THREAD] - %@", [error localizedDescription]); 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSError *error; 
     if (![_mainManagedObjectContext save:&error]) 
     { 
      NSLog(@"[MAIN_THREAD] - %@", [error localizedDescription]); 
     } 
     else { 
      if (completionBlock != nil) 
      { 
       completionBlock(); 
      } 
     } 
    }); 
} 

回答

1

我應該發現的NSManagedObjectContext類引用文檔中的解決方案,尤其是讀一段「併發」。

+0

我讀過。它沒有說明如何正確保存到父上下文,並確保父上下文在包含數據的情況下發布通知。 –

+0

您是否點擊了「核心數據併發」鏈接?在這裏你可以找到以下信息:「使用通知跟蹤其他線程的變化」,「保存在後臺線程中容易出錯」... –

+0

我的問題出現在另一個區域,我認爲這是導致它的原因。我雖然保存正確。爲了您的幫助,我會給你正確的答案。 –

相關問題