2017-08-17 153 views
0

这是我的核心数据操作的代码片段。大多数时候它都能正常工作。但是现在,当我添加核心数据调试参数以查看所有核心数据调用在多线程Core Data Concurrency Debugging上是否正常时,我在行上看到一个崩溃[contexts reset]; 。[managedObjectContext reset]上的核心数据崩溃;

- (void)readAllModelObjects { 

NSFetchRequest * fr = [NSFetchRequest ....] 

NSManagedObjectContext * context = [selg getChildContext]; 

    [context performBlockAndWait:^{ 

     NSArray * resultArray = [context executeFetchRequest:fr error: nil ]; 

     NSArray * nonCoreDataModelObjectsArray = [self parseCoreDataObjectsToModel: resultArray]; 

     _memberResultArray = nonCoreDataModelObjectsArray ; 

    }]; 

    [context reset]; // This is the line it crashes .  
} 


- (NSManagedObjectContet *)getChildContext { 

    NSManagedObjectContext * privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

    privateContext.parentContext = [self mainQueueManagedObjectContext]; 

    return privateContext ; 
    } 


- (NSArray *)parseCoreDataObjectsToModel:(NSArray *)cdObjectsArray { 

    // creates and initializes the model objects array (non managed object class objects) from core data objects 
    // return this array 
    } 
  • 只有一个连接到持久性存储协调器主队列上下文。对于为核心数据操作创建的每个子上下文,这一个用作父项。

  • (void)readAllModelObjects按预期从后台线程中调用。

我有以下错误从核心数据

CoreData`+[NSManagedObjectContext _ 
_Multithreading_Violation_AllThatIsLeftToUsIsHonor__]: 

任何提示/建议,一定会帮我找出死机,请帮助。

回答

1

更改managedObject的值时,只有在保存上下文之后,才会保存这些更改。一旦保存了上下文,上下文就会写入磁盘或将其推送到其父上下文。这是一种将所有变更都作为一个单元完成的方式 - 在数据库中说它将被称为交易。 reset撤销这些更改。所以就像改变对象需要在正确的线程上完成,reset解除了更改,需要在正确的线程上完成。

在你的情况下,根本没有必要调用reset,因为你没有改变上下文。上下文没有任何将被reset撤销的更改。如果您想拨打reset,您需要在performBlockAndWait内进行。

TD; DR[context reset]不是线程安全的,必须从正确的线程完成。

+0

请您详细说明为什么在我们从核心数据中读取对象时,调用reset是没有用的? –