3

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

4

2 回答 2

6

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

来自苹果:

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

使用多线程 CoreData 和多个托管对象上下文时仍有许多注意事项,对于那些我建议您参考rsswtmr 的出色答案,它没有正确回答我的问题,但提供了指向许多有用信息的链接。

于 2013-04-20T21:58:52.723 回答
2

您不能让多个线程在同一个对象上下文上工作。想一想 Core Data 如何在更改/提交数据的过程中参与其中,而另一个更改来自另一个线程。您需要为每个线程创建一个单独的上下文,并在安全/适当时合并更改。这NSOverwriteMergePolicy将使您不必在合并时手动处理冲突。

在这里寻找线程核心数据访问的一个很好的解释。

于 2012-11-21T05:12:18.470 回答