我有一个Realm对象(LFEMemory),它有一个发布方法。
当我调用publish方法时,我必须将图像上传到AWS,然后使用Amazon返回的URL更新对象。
问题是当块从AWS返回时,我的自我LFEMemory对象不再是线程安全的。 (事实上,它通常是在应用程序的正常运行期间,但从不使用App扩展程序)。
我可以通过从realm对象中删除publish方法并在控制器对象中处理它来解决这个问题,控制器对象可以在新线程上获取新的realm对象。但这意味着每次我称之为块时我都需要创建新领域,这肯定不是一个好习惯。
大多数人如何处理这种情况?
- (void)publishWithBlock:(ResultBlock)block {
FileUploadManager *manager = [[FileUploadManager alloc] init];
[manager uploadWithSuccess:^(NSString *filename) {
//self is no longer thread-safe and will cause a crash
self.media.path = filename;
} failure:^(NSError *error) {
block(NO, error);
};
}
答案 0 :(得分:1)
您可以探索各种选项:
1)如果您的对象具有主键(字符串或数字),您可以将id作为常量存储在方法中,并使用它通过[Realm objectOfType:forPrimaryKey:]
从任何线程中获取对象。 docs
2)如果你没有主键,你只需在主线程上创建self.media
,每当上传完成后,再次切换到主队列并在那里修改你的对象 - 修改一个Realm对象上的属性或两个属性不会对主线程上的所有性能造成损害。
此外 - 如果您有权访问您的对象(如在self.media
中),则它已经允许您访问用于通过其realm
属性docs创建/读取对象的原始Realm
仍然 - 如果有疑问,我会继续使用对象的主键来重新获取我需要的对象的引用。