我在iPhone应用程序上遇到间歇性,难以重现的错误,所以我正在检查我对并发性的假设。
运行AFNetworking v0.10.x,我有以下网络电话:
[self postPath:@"/myEndPoint"
parameters:params
success:^(AFHTTPRequestOperation *request, id response)
{
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// do stuff with object context here
[appDelegate.objectContext save];
}
]
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// do other stuff with object context
[appDelegate.objectContext save];
在我的AppDelegate中:
-(NSManagedObjectContext*) objectContext
{
if(nil == _objectContext)
{
... set up sqlite persistent store coordinator and object model ...
_objectContext = [[NSManagedObjectContext alloc] init];
[_objectContext setPersistentStoreCoordinator:persistentStoreCoordinator];
[_objectContext setMergePolicy:NSOverwriteMergePolicy];
}
return _objectContext;
}
在这种情况下,是否有可能最终出现并发问题?或者,换句话说,AFNetworking的API线程安全吗?我认为NSOverwriteMergePolicy会因冲突而覆盖我,但崩溃仍然存在(尽管是间歇性的)。
答案 0 :(得分:6)
AFNetworking的回调在主线程上执行。因此,它们是“线程安全的”,因为只有一个线程与CoreData交互。如果您只有一个托管对象,那么事情就会很简单。
来自Apple:
添加到此队列的任务是在主线程本身上串行执行的。因此,您可以将此队列用作在应用程序的其他部分中完成工作的同步点。
使用多线程CoreData和多个托管对象上下文时仍有许多注意事项,对于那些我引用你rsswtmr's excellent answer的人,它没有正确回答我的问题,但提供了很多好的链接信息。
答案 1 :(得分:2)
您不能让多个线程处理同一个对象上下文。通过更改/提交数据,同时另一个线程上的另一个更改通过,可以考虑核心数据如何处于分离状态。您需要为每个线程创建一个单独的上下文,并在安全/适当时合并更改。 NSOverwriteMergePolicy
只会让您不必在合并时手动处理冲突。
查看here以获取有关线程数据访问线程的详细说明。