gpt4 book ai didi

objective-c - 将后台存储的一组 Core Data 对象传递给主线程的方法是什么?

转载 作者:行者123 更新时间:2023-12-02 21:50:12 24 4
gpt4 key购买 nike

我的 iOS 项目的一部分会轮询服务器以查找对象集,然后将它们转换并保存到 Core Data,然后使用结果更新 UI。服务器任务发生在 NSOperation 类的集合中,我将其称为在后台运行的“服务”。如果NSManagedObject及其 ~Context如果是线程安全的,我会让服务在主线程上调用委托(delegate)方法,如下所示:

- (void)service:(NSOperation *)service retrievedObjects:(NSArray *)objects;

当然you can't pass around NSManagedObject s这样的话,那么这个委托(delegate)方法就注定了。据我所知,有两种解决方案可以从主线程获取对象。但我不喜欢它们,所以我希望伟大的 StackOverflow 社区可以帮助我想出第三个。

  1. 我可以执行NSFetchRequest在主线程上拉入新添加或修改的对象。问题是核心数据存储包含更多这样的对象,因此我必须添加相当多的冗长内容来传达正确的对象集。一种方法是向对象添加属性,例如 batchID ,然后我可以将其传回委托(delegate),以便它知道要获取什么。但是向存储添加数据来解决我的并发限制感觉是错误的。

  2. 我还可以收集新添加的对象' objectID 属性,将它们放入列表中并将该列表发送到委托(delegate)方法。但不幸的是,我必须在保存上下文之后填充列表,这意味着我必须在后台循环对象两次才能获得正确的列表(第一次是在解析时)服务器响应)。那么我仍然只有objectID的列表s,我必须单独使用 existingObjectWithID:error: 来卷取它来自NSManagedObjectContext在主线程上。这看起来很麻烦。

我缺少什么信息?带一套NSManagedObject第三个解决方案是什么?从后台线程到主线程,而不失去线程限制?

最佳答案

历史学家,

虽然您显然有一个满意的解决方案,但我建议您通过您的机制丢失一些有值(value)的信息,无论项目是更新、删除还是插入。在我的代码中,我只是将 userInfo 字典迁移到新的 MOC。这是执行此操作的通用例程:

// Migrate a userInfo dictionary as defined by NSManagedObjectContextDidSaveNotification
// to the receiver context.
- (NSDictionary *) migrateUserInfo: (NSDictionary *) userInfo {

NSMutableDictionary *ui = [NSMutableDictionary dictionaryWithCapacity: userInfo.count];

NSSet * sourceSet = nil;
NSMutableSet *migratedSet = nil;

for (NSString *key in [userInfo allKeys]) {

sourceSet = [userInfo valueForKey: key];
migratedSet = [NSMutableSet setWithCapacity: sourceSet.count];

for (NSManagedObject *mo in sourceSet) {

[migratedSet addObject: [self.moc objectWithID: mo.objectID]];
}
[ui setValue: migratedSet forKey: key];
}
return ui;

} // -migrateUserInfo:

上面的例程假设它是一个具有@property NSManagedObjectContext *moc的类的方法。

希望您觉得以上内容有用。

安德鲁

关于objective-c - 将后台存储的一组 Core Data 对象传递给主线程的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706979/

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