在后台线程上将 XML 解析为 CoreData 以不锁定 UI

Posted

技术标签:

【中文标题】在后台线程上将 XML 解析为 CoreData 以不锁定 UI【英文标题】:Parse XML into CoreData on Background Thread to not lock up UI 【发布时间】:2011-05-18 06:51:13 【问题描述】:

我的应用程序将 xml 文件解析为 coredata 以填充 uitableview。当我触发刷新时,它应该去下载一个新的 xml 文件,在后台线程上解析它,然后一次将其全部保存到 managedobjectcontext(替换旧的 managedobjectcontext 数据),然后更新表。这样,类似于 Twitter 应用程序,用户可以触发重新加载并在加载时仍然滚动。

这似乎是一件很标准的事情,但我似乎找不到任何帮助。

目前我正在使用 NSURLConnection 在我的 App Delegate 中下载 XML 以不锁定 UI。下载完成后,它会调用:

ParseOperation *parseOperation = [[ParseOperation alloc] initWithData:receivedData andArray:[NSManagedObjectContext defaultContext]];

[self.parseQueue addOperation:parseOperation];

这将在我认为是后台线程的地方开始解析。我可以在这里下载xml然后....

2 问题:1)如何保存到主线程的managedobjectcontext? 2) 如何访问核心数据中的旧实体以与更新后的 xml 进行比较?

之前肯定有人遇到过这种情况...有任何示例代码吗?

【问题讨论】:

【参考方案1】:

听起来您的总体思路是正确的,但您的执行可能会失败。

首先,仅仅将与核心数据相关的操作放入 NSOperation 并不能让它神奇地工作。您需要确保将 MOC 专用于操作实例(不要使用主线程 MOC),然后使用 performBlock 方法确保使用正确的队列附加专用 MOC到同一个 PSC 并使用“已保存”通知将更改合并回主线程 MOC。

至于问题的第二部分,您需要获取现有数据以确定项目是新的还是更新的,然后做出相应的反应。您可能希望预先获取每个新项目,然后使用内存中的谓词从该集合中过滤您要查找的数据,而不是获取每个新项目(这种方法更快,但可能会导致内存压力取决于项目的数量和出现故障时它们在内存中的大小)。

【讨论】:

以上是关于在后台线程上将 XML 解析为 CoreData 以不锁定 UI的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreData 的后台线程中创建实体

在后台线程中加载 CoreData

在 cellForRowAtIndexPath 中获取 iOS CoreData 后台线程

CoreData从后台线程读取数据仍然阻塞UI界面的原因及解决

CoreData 并通知后台工作人员有关主线程的更改

coredata更新json后台线程问题