为什么iOS在通过UIManagedDocument保存核心数据时延迟?

我正在使用核心数据在SQLite数据库中保存一些信息。 我正在用模拟器进行testing,并使用sqlite3来查询数据库,并validation我正在存储我所期望的。

我所看到的是数据不会出现在SQLite数据库中,直到我保存好15-20秒之后。

这里是我把我的保存下来的代码:

 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]); 

保存操作完成而没有错误。

有什么提示,为什么我看到这个延迟? 我的保存操作是否运行不正常,或者延迟将数据保存在模拟器的工件中?

因为你应该使用:

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

解!

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

UIManagedDocument嵌套父/子上下文体系结构。 延迟是由于不手动保存父上下文而造成的。 你所做的只是提交从子上下文到父上下文的改变,而不是从父上下文到持久存储。 父上下文的自动保存被运行时间调用,因此延迟。

修复很简单:或者像Flinkbuild议的那样通过saveToURL保存文档,或者保存两个子上下文和父上下文。 前一种方法比较简单,适用于大多数情况。 如果您想使用第二种方法,请小心正确地引用每个上下文。 document.managedObjectContext将得到你的CHILD上下文(在主线程上), document.managedObjectContext.parentContext将得到你的父上下文。