CoreData与GCD队列的AFNetworking请求不兼容?

时间:2012-07-11 08:14:39

标签: objective-c ios multithreading grand-central-dispatch afnetworking

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

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

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

我尝试过使用dispatch_sync(run_queue),但这并不能保证线程是一样的,只有GCD队列。主线程中的另一个MOC保存稍后会挂起。

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

有人能提出更优雅的解决方案吗?或者CoreData与从GCD队列启动的AFNetworking请求完全不兼容,我应该从一开始就看一个较低级别的线程控制?

1 个答案:

答案 0 :(得分:0)

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

我与https://github.com/magicalpanda/MagicalRecord/合作取得了相当不错的成功,以便以更简单的方式为此提供便利。