- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 iOS 项目的一部分会轮询服务器以查找对象集,然后将它们转换并保存到 Core Data,然后使用结果更新 UI。服务器任务发生在 NSOperation 类的集合中,我将其称为在后台运行的“服务”。如果NSManagedObject
及其 ~Context
如果是线程安全的,我会让服务在主线程上调用委托(delegate)方法,如下所示:
- (void)service:(NSOperation *)service retrievedObjects:(NSArray *)objects;
当然you can't pass around NSManagedObject
s这样的话,那么这个委托(delegate)方法就注定了。据我所知,有两种解决方案可以从主线程获取对象。但我不喜欢它们,所以我希望伟大的 StackOverflow 社区可以帮助我想出第三个。
我可以执行NSFetchRequest
在主线程上拉入新添加或修改的对象。问题是核心数据存储包含更多这样的对象,因此我必须添加相当多的冗长内容来传达正确的对象集。一种方法是向对象添加属性,例如 batchID
,然后我可以将其传回委托(delegate),以便它知道要获取什么。但是向存储添加数据来解决我的并发限制感觉是错误的。
我还可以收集新添加的对象' 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/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!