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

标签 objective-c cocoa-touch core-data concurrency delegation

我的 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/

相关文章:

xcode - 在 Xcode 4 中保存核心数据模型

swift - 在 Core Data 中存储 Swift 值类型

ios - 未实现的谓词 SQL 生成

ios - 自定义 ViewController 中的 UITableView : Custom UITableViewCells Are Overlapping

ios - 在 iOS 中显示和删除相同的按钮

objective-c - 我怎样才能拥有一个同时包含图像和文本的 UIBarButtonItem?

ios - 无法呈现多边形(无法保留索引 : XX): featureID: X key: XXXX

ios - 在 iOS 中移动 UICollectionView 的单元格?

objective-c - 如何像时间机器一样创建开/关动画?

objective-c - 如何从不同的 View Controller 以不同的方式响应 applicationWillResignActive