gpt4 book ai didi

ios - 将对象从主队列中的父上下文传递到私有(private)队列中的子上下文

转载 作者:行者123 更新时间:2023-11-28 18:56:00 27 4
gpt4 key购买 nike

我在一个类中有一个 NSMutableArray 属性,在这个类中我一直引用 NSManagedObjectContext 的一些托管对象,我称之为 mainContext关联到主队列。在同一个类中,我在私有(private)队列中创建了一个 privateContext,并将其设置为 mainContext 的子级。

我想将属于 mainContextNSMutableArray (self.entities) 中的对象传递给它的子对象privateContext,同时,一旦这些对象位于另一个数组 (self.tempEntities) 的 privateContext 中,就会保留对此类对象的引用。我想保留这些引用,因为稍后我将在 privateContext 中插入新对象,并且我需要轻松地知道当时 privateContext 中的哪些对象来了来自其父 mainContext

我不确定这种做法是否正确:

for (MyEntity *entity in self.entities) { // this is main thread
[self.privateContext performBlockAndWait: ^{
[self.privateContext objectWithID:entity.objectID];
[self.tempEntities addObject:entity];
}];
}

否则这会在以后引起任何问题。或者有没有其他更好的方法来做到这一点?

谢谢

编辑:在这种情况下,当 child 被保存时,父上下文将如何更新?我的意思是:在我的场景中,将父对象中的对象传递给子上下文的目的是,我需要在子上下文中将其新对象与从父对象传递的对象进行比较。然后,也许我需要删除一些来自父级的对象,和/或用子级中的一些新闻替换一些来自父级的对象,和/或将子级中的一些新对象插入父级.

调用 [self.privateContext save:nil]; 是否会将父上下文中的所有对象替换为子上下文中的对象,或者如何处理合并?

再次感谢

最佳答案

你还在后台线程中访问主线程对象,这是不允许的。这可能有效(如果它不触发自动获取),但在进入后台线程之前获取对象 ID 更安全。

NSManagedObjectID objectID = entity.objectID;
[self.privateContext performBlockAndWait: ^{
MyEntity *bgEntity = [self.privateContext objectWithID:objectID]
// do something with the entity, e.g. update it and save.
}];

确保您在 block 的后台完成了您需要做的所有事情。我会建议不要将这些对象分配给 Controller (就像您对 self.tempEntities 所做的那样),在那里它们再次可用于主线程。如果在主线程上访问它们,您的应用程序将崩溃。

另一个改进可能是只使用一个上下文。

 NSArray *objectIDs = [self.entities valueForKeyPath:@"objectID"];
[self.privateContext performBlockAndWait ^{
for (NSManagedObjectID *objectID in objectIDs) {
MyEntity *bgEntity = [self.privateContext objectWithID:objectID];
// process...
}
}];

至于更新主上下文:当您保存子上下文时,它所做的只是将更改“推送”到父上下文。父上下文现在知道更改,但当然它不会自动更新您的数组。

有两种途径:更复杂和更危险的一种是监听 NSManagedObjectContextObjectsDidChangeNotification。在通知处理程序中,您可以更新数组和 TableView 。不过,这是有风险的,因为没有内存或性能优化等。

更好:使用 NSFetchedResultsController 并实现 NSFetchedResultsControllerDelegate 方法来更新您的表或其他数据结构。您可以免费获得许多强大的功能。

关于ios - 将对象从主队列中的父上下文传递到私有(private)队列中的子上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809614/

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