【问题标题】:Why does iOS delay when saving Core Data via a UIManagedDocument?为什么通过 UIManagedDocument 保存 Core Data 时 iOS 会延迟?
【发布时间】:2012-04-05 02:11:03
【问题描述】:

我正在使用 Core Data 将一些信息保存在 SQLite 数据库中。我正在使用模拟器进行测试,并使用 sqlite3 查询数据库并验证我存储的内容是否符合预期。

我看到的是数据在我保存后的 15-20 秒后才会出现在 SQLite 数据库中。

这是我保存的代码:

NSEntityDescription *customerType = [NSEntityDescription entityForName:@"CustomerType" inManagedObjectContext:context];
CustomerType *ct = [[CustomerType alloc]initWithEntity:customerType insertIntoManagedObjectContext:context ];
ct.code = code;

NSError* error = nil;
if (![context save:&error] || error)
    NSLog(@"Saved new customer (error=%@)", [error debugDescription]);

保存操作成功完成。

关于我为什么会看到这种延迟的任何提示?是我的保存操作没有正常运行,还是延迟保存数据是模拟器造成的?

【问题讨论】:

  • 以后,如果您的问题与 objc 开发有关,请务必将您的问题标记为 Objective-C,因为它告诉 StackOverflow 如何突出显示发布的代码。
  • @Andrew:请从您的解决方案中创建一个答案,然后接受它。目前,问题似乎没有答案,这将使与您有相同问题的人更难搜索答案。
  • 抱歉——有点生锈了。完成!

标签: objective-c ios sqlite core-data


【解决方案1】:

因为你应该使用:

    [self.document saveToURL:self.document.fileURL
            forSaveOperation:UIDocumentSaveForOverwriting
           completionHandler:^(BOOL success) {                   
               if (success) {                       
                   NSLog(@"saved");
               } else {                       
                   NSLog(@"unable to save");
               }
               }];

【讨论】:

    【解决方案2】:

    解决办法!

    我通过UIManagedDocument 创建了NSManagedObjectContext。为了及时保存数据,我需要保存托管文档,而不仅仅是保存我对托管对象上下文中的对象图所做的更改。

    【讨论】:

    • 非常感谢,这两天我一直在努力解决这个问题!
    【解决方案3】:

    UIManagedDocument 具有嵌套的父/子上下文架构。延迟是由于未手动保存父上下文引起的。您所做的只是将更改从子上下文提交到父上下文,而不是从父上下文提交到持久存储。运行时不时调用父上下文的自动保存,因此延迟。

    修复很简单:要么像 Flink 建议的那样通过 saveToURL 保存文档,要么保存 BOTH 子上下文和父上下文。前一种方法更简单,适用于大多数情况。如果您想使用第二种方法,请注意正确引用每个上下文。 document.managedObjectContext 将为您获取 CHILD 上下文(在主线程上),document.managedObjectContext.parentContext 将为您获取父上下文。

    【讨论】:

    • 第二种方式在什么情况下有优势?
    • 我认为这取决于您的应用程序中使用的父上下文。例如,您可以在创建父上下文的私有线程上下载照片,对应于从子上下文保存的某些对象属性(如照片的所有者)。根据payload对托管对象进行修改,然后保存父上下文。
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2020-02-05
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多