'只能在使用队列创建的NSManagedObjectContext上使用-performBlock:'错误

时间:2015-07-22 08:25:24

标签: objective-c multithreading crash nsmanagedobjectcontext

我使用NSManagedObjectContext performBlock{} 但, 我的应用程序总是崩溃

  

***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因是:'只能在使用队列创建的NSManagedObjectContext上使用-performBlock:'

如何了解NSManagedObjectContext的正确主题。 创建NSManagedObjectContext代码在这里

Person *aPerson = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[CoreDataManager sharedInstance].managedObjectContext];

请发表一些意见

2 个答案:

答案 0 :(得分:0)

像这样创建你的ManagedObjectContext

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
                     initWithConcurrencyType:NSMainQueueConcurrencyType];

NSMainQueueConcurrencyType创建一个与主调度队列相关联的上下文,从而创建主线程。您可以使用这样的上下文将其链接到在主线程上运行所需的对象,例如UI元素。

NSPrivateQueueConcurrencyType创建并管理要运行的私有调度队列。您必须使用新方法performBlock:或performBlockAndWait:。然后,上下文将在其自己的专用队列上执行传递的块。

最后,NSConfinementConcurrencyType是默认类型,只能在创建它的线程中使用。

答案 1 :(得分:0)

错误并未表示您使用的是错误的线程。它表示只能在使用队列创建的上下文中使用-performBlock:。如NSManagedObjectContext / Concurrency的类引用中所述,这只是使用NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType选项之一创建的上下文。

  

使用基于队列的并发类型与performBlock:和performBlockAndWait:一起使用上下文。