我想实现一些基本的UIManagedDocument导入/导出功能到我的应用程序,主要是为了开发,以便我可以轻松地检查文档内容和当我开始尝试在我的CoreData模型上迭代时,更关键地保留一组测试数据。UIManagedDocument父上下文对象插入背景优先级队列中不使用子上下文在UI中更新
我想要做的就是从本地文件加载一些JSON数据并将其注入到我的应用程序UIManagedDocument中。 UIManagedDocument的ManagedObjectContext内容在我的应用程序中使用斯坦福大学iOS课程中的一些核心数据表视图控制器进行可视化。
我想我会尝试写一些线程来保持UI响应并学习如何去做。所以我做了这样的事情
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// read JSON data file
// parse JSON into dictionaries etc
// iterate over dictionaries
// try to create a new core data entity with my document's ManagedObjectContext
});
起初我以为这是工作。没有错误,断言,崩溃触发,看着我的CoreData TableViews,我可以看到我的用户界面中新增加的对象。不幸的是,新增加的物品似乎从未被保存回商店。我甚至迷上了听我的UIDocument的managedObjectContext中的NSManagedObjectContextDidSaveNotification,并且看到它没有按下主页按钮时触发,就像它通常会在应用程序中执行一些更改并且我的UI未完成时一样。事实上,即使在UI中执行这些操作也不会导致通知和保存发生,因此显然不开心。
我展开后台队列中的代码,并同步在主线程上运行它,并且一切正常,新数据保存正确。
我开始阅读关于线程和coredata的复杂性,文档似乎使用UIDocument的ManagedObjectContext的母公司ManagedObjectContext在后台执行操作,所以我尝试再次做同样的代码中使用这个父上下文暗示,所以如下
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// read JSON data file
// parse JSON into dictionaries etc
// iterate over dictionaries
// try to create a new core data entity with my document's ManagedObjectContext parent ManagedObjectContext
});
这次出于某种原因,CoreData TableView控制器不再更新以显示新注入的对象。即使在明确调用保存父上下文之后,也没有出现任何内容。然而,在退出应用程序并重新加载应用程序时,新注入的对象确实似乎被正确添加。有趣的是,在这一点上,我用一个cachename指定了一个fetchrequest,并在注入这些对象后在应用程序的第一次运行中抛出一个错误。不知怎的,对象直接来自父上下文的方式可能会使缓存失效,但这仍然是我不完全明白的。即使将缓存更改为nil,也无法解决表视图问题与对象注入父上下文时不同的会话更新问题。
查看其他地方我见过managedObjectContext performBlock建议的一些用法。执行其中有人说,你必须将所有更改后拨打
[document updateChangeCount:UIDocumentChangeDone]
,以确保节能另一种情况,或者使用
- (void)autosaveWithCompletionHandler:(void (^)(BOOL success))completionHandler
代替。虽然在其他地方我已经提到过,保存应该足以将上下文内容推送到层次结构中。是否仅从孩子 - >父母而不是父母 - >孩子工作。
或者我只是做错了吗?
任何人的时间和帮助真的很感激!干杯。
感谢您的回答。我在工作时刚刚浏览了一遍,我唯一想知道的是它似乎都是关于与UIManagedDocuments(我的)无关的MOC。我在这里发现了另一个问题 - http://stackoverflow.com/questions/11350670/uimanageddocument-with-nsfetchedresultscontroller-and-background-context with a comment“Apple不支持context -save:使用托管文档时。也许获得你应该叫永久ID后,[文件updateChangeCount:UIDocumentChangeDone]” 也许UIManagedDocuments事情进一步复杂化? – jimbobuk