gpt4 book ai didi

ios - [managedObjectContext reset] 时核心数据崩溃;

转载 作者:行者123 更新时间:2023-11-29 00:13:53 28 4
gpt4 key购买 nike

这是我核心数据操作的代码片段。大多数时候它工作正常。但是现在,当我添加核心数据调试参数以查看所有核心数据调用在多线程方面是否正常时 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__]:

任何提示/建议肯定会帮助我解决崩溃问题,请帮忙。

最佳答案

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

就您而言,根本不需要调用reset,因为您没有对上下文进行任何更改。上下文没有任何可通过重置撤消的更改。如果您想调用reset,则必须在performBlockAndWait内部执行。

TD;DR:[上下文重置]不是线程安全的,必须从正确的线程完成。

关于ios - [managedObjectContext reset] 时核心数据崩溃;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com