【问题标题】:Core Data Managed Object Context Saving核心数据托管对象上下文保存
【发布时间】:2014-02-28 20:20:47
【问题描述】:

我已经设置了两个 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();
            }
        }
    });
}

【问题讨论】:

    标签: ios core-data nsmanagedobjectcontext


    【解决方案1】:

    我应该在 NSManagedObjectContext 类参考的文档中找到您的解决方案,特别是阅读“并发”段落。

    【讨论】:

    • 我已经读过了。它没有说明如何正确保存到父上下文并确保父上下文发布包含数据的通知。
    • 您是否点击了“Concurrency with Core Data”链接?在这里您可以找到有关以下内容的信息:“使用通知跟踪其他线程中的更改”、“保存在后台线程中容易出错”...
    • 我的问题出在另一个区域,我认为这是造成问题的原因。我保存它虽然正确。为了您的帮助,我会给您正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多