ObjC Realm线程问题

时间:2016-09-23 14:55:28

标签: objective-c multithreading realm

我有一个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);
    };
}

1 个答案:

答案 0 :(得分:1)

您可以探索各种选项:

1)如果您的对象具有主键(字符串或数字),您可以将id作为常量存储在方法中,并使用它通过[Realm objectOfType:forPrimaryKey:]从任何线程中获取对象。 docs

如果那是你需要做的事情,那就不要害怕从不同的线索中获得一个新的领域 - 这不会创造另一个"另一个"另一个"领域或复制您的文件。

2)如果你没有主键,你只需在主线程上创建self.media,每当上传完成后,再次切换到主队列并在那里修改你的对象 - 修改一个Realm对象上的属性或两个属性不会对主线程上的所有性能造成损害。

此外 - 如果您有权访问您的对象(如在self.media中),则它已经允许您访问用于通过其realm属性docs创建/读取对象的原始Realm

仍然 - 如果有疑问,我会继续使用对象的主键来重新获取我需要的对象的引用。