我正在使用 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 请求,我应该从一开始就查看较低级别的线程控制?