AFNetworking与CoreData线程安全吗?

时间:2012-11-21 02:33:47

标签: iphone ios core-data afnetworking

我在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会因冲突而覆盖我,但崩溃仍然存在(尽管是间歇性的)。

2 个答案:

答案 0 :(得分:6)

AFNetworking的回调在主线程上执行。因此,它们是“线程安全的”,因为只有一个线程与CoreData交互。如果您只有一个托管对象,那么事情就会很简单。

来自Apple:

  

添加到此队列的任务是在主线程本身上串行执行的。因此,您可以将此队列用作在应用程序的其他部分中完成工作的同步点。

使用多线程CoreData和多个托管对象上下文时仍有许多注意事项,对于那些我引用你rsswtmr's excellent answer的人,它没有正确回答我的问题,但提供了很多好的链接信息。

答案 1 :(得分:2)

您不能让多个线程处理同一个对象上下文。通过更改/提交数据,同时另一个线程上的另一个更改通过,可以考虑核心数据如何处于分离状态。您需要为每个线程创建一个单独的上下文,并在安全/适当时合并更改。 NSOverwriteMergePolicy只会让您不必在合并时手动处理冲突。

查看here以获取有关线程数据访问线程的详细说明。