1

我正在使用 GCD 启动一个长时间运行的后台进程('run_loop'),它创建一个 NSManagedObjectContext ('MOC'),监控 CoreData 对象,有时(当它们准备好时)将它们的序列化上传到网络服务器,然后删除它们。

我正在使用 AFNetworking 进行 HTTP 调用。问题出在请求完成处理程序块中,因为这些块在与 MOC 所有者不同的线程中运行,CoreData 不支持。

我尝试从 GCD run_loop 块的开头存储 NSThread,并使用 performSelector:onThread:run_thread 但这似乎根本没有真正调用选择器。

我曾尝试使用 dispatch_sync(run_queue) 但这并不能保证线程是相同的,只有 GCD 队列。稍后在主线程中保存的不同 MOC 挂起。

最终,唯一可行的方法是在完成回调处理程序中设置一个布尔值,并引入额外的逻辑来检测布尔开关并从主 run_loop 执行 MOC 工作。

任何人都可以提出更优雅的解决方案吗?还是 CoreData 根本不兼容从 GCD 队列启动的 AFNetworking 请求,我应该从一开始就查看较低级别的线程控制?

4

1 回答 1

0

嗯.. 处理 MOC 和线程的推荐方法是始终创建一个新的 MOC,它是主线程 MOC 的子 MOC。让主线程来做所有的保存,但是你的 GCD 线程基本上可以将更改合并到主 MOC。

我与https://github.com/magicalpanda/MagicalRecord/合作取得了相当大的成功,以更简单的方式促进了这一点。

于 2012-07-11T08:19:06.130 回答