【问题标题】:Core Data crash on [managedObjectContext reset];[managedObjectContext reset] 上的核心数据崩溃;
【发布时间】:2018-01-25 12:54:54
【问题描述】:

这是我的核心数据操作的代码sn-p。它在大多数情况下都能正常工作。但是现在,当我添加核心数据调试参数以查看所有核心数据调用是否都适用于多线程 Core Data Concurrency Debugging 时,我看到 [contexts 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__]:

任何提示/建议肯定会帮助我找出崩溃,请帮助。

【问题讨论】:

    标签: ios objective-c multithreading debugging core-data


    【解决方案1】:

    当您更改 managedObject 的值时,这些更改在保存上下文之前不会保存。保存上下文后,上下文要么写入磁盘,要么将其推送到其父上下文。这是一种将一些更改全部作为一个单元完成的方法——在数据库中,它被称为事务。 reset 撤消这些更改。因此,就像更改对象需要在正确的线程上完成一样,撤消更改的reset 也需要在正确的线程上完成。

    在您的情况下,根本不需要调用reset,因为您没有根据上下文更改任何内容。上下文没有任何可以被reset 撤消的更改。如果您想致电reset,则必须在performBlockAndWait 内进行。

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

    【讨论】:

    • 您能否详细说明为什么在我们从核心数据中读取对象时调用 reset 没有用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2023-03-14
    • 2018-09-02
    • 2023-03-10
    相关资源
    最近更新 更多