0

我想实现一些基本的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 

代替。虽然在其他地方我已经提到过,保存应该足以将上下文内容推送到层次结构中。是否仅从孩子 - >父母而不是父母 - >孩子工作。

或者我只是做错了吗?

任何人的时间和帮助真的很感激!干杯。

回答

0

寻找到所有我能找到的类似问题的建议后,他们没有似乎帮助。

我到底在描述这个场景有实体店的东西文件来处理好了,但用户界面没有更新。当我执行此导入/导出时,我处于核心数据表视图控制器的顶部视图,该视图在注入所有这些JSON对象时不会更新,因此最终我所做的只是强制该控制器重新 - 获取数据。我相信NSFetchedResultsController是为了监视managedObjectContext并根据需要更新获取请求。无论出于何种原因,这是行不通的。

同力再取出叫,似乎一切工作正常。新注入的实体出现在我的表格中,并保存到商店文件中。

要么有在这些对象中的一些错误,或者我还在使用它错了,但我看其他的问题......我的导入/导出数据既现在的工作与父上下文后台线程。我今天注意到的是,我可以使用UI在主线程上使用子上下文正确插入和编辑一些对象。在进行这些编辑之后,我不会刻意调用任何内容,所以我想编辑内容仍在等待核心数据决定保存。如果我然后去我的导出功能,并使用它的父上下文,然后我发现新编辑或插入的对象不存在。

显然没有消息发生时间从孩子 - >父母,消息从后台线程编辑对父母本身似乎并没有工作..我从来没有得到任何通知我在线程中执行的编辑尽管他们看起来有效,但在父母的情况下。如果我通过文档强制保存,那么即使编辑正确保存以便以某种方式存储文件,传入的字典也不会显示正在编辑的内容。

我想我现在需要强制我的文档每次操作后保存,或者我即将做另一个线程来保证父/子至少每操作之前​​都保持同步。

仍然是我最初描述的问题,我设法解决,但我仍然想知道应该如何使用UIManagedDocument的父和子上下文来避免遇到这些问题。

0

请看看在Multi-Context CoreData的“父/子上下文”部分。

每当孩子MOC保存父母学习这些变化,并且这也导致获取的结果控制器也被告知这些变化。然而,这还没有持续数据,因为背景MOC不知道PSC。要获取数据到磁盘,您需要在主队列MOC上增加一个saveContext:。

我保存到PSC N按照方式:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
{ 
    // read JSON data file 
    // parse JSON into dictionaries etc 
    // iterate over dictionaries 

    NSError* error; 
    if (self.managedObjectContext.hasChanges) 
    { 
     [self.managedObjectContext save: &error]; 
    } 

    // Save main context 
    dispatch_sync(dispatch_get_main_queue(),^
    { 
     [[AXContextHelper sharedInstance] saveMainContext]; 
    }); 
} 
+0

感谢您的回答。我在工作时刚刚浏览了一遍,我唯一想知道的是它似乎都是关于与UIManagedDocuments(我的)无关的MOC。我在这里发现了另一个问题 - http://stackoverflow.com/questions/11350670/uimanageddocument-with-nsfetchedresultscontroller-and-background-context with a comment“Apple不支持context -save:使用托管文档时。也许获得你应该叫永久ID后,[文件updateChangeCount:UIDocumentChangeDone]” 也许UIManagedDocuments事情进一步复杂化? – jimbobuk

相关问题