AFNetworking与CoreData线程安全吗?

mer*_*ial 3 iphone core-data ios 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];      
Run Code Online (Sandbox Code Playgroud)

在我的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;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否有可能最终出现并发问题?或者,换句话说,AFNetworking的API线程安全吗?我认为NSOverwriteMergePolicy会因冲突而覆盖我,但崩溃仍然存在(虽然是间歇性的).

mer*_*ial 6

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

来自Apple:

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

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