【问题标题】:ObjC Realm Threading issueObjC 领域线程问题
【发布时间】:2016-09-23 14:55:28
【问题描述】:

我有一个 Realm 对象 (LFEMemory),它有一个发布方法。

当我调用发布方法时,我必须将图像上传到 AWS,然后使用 Amazon 返回的 URL 更新对象。

问题是当块从 AWS 返回时,我自己的 LFEMemory 对象不再是线程安全的。 (事实上​​,它通常是在应用程序的正常运行期间,但如果我使用的是应用程序扩展,则不会)。

我可以通过从领域对象中删除发布方法并在控制器对象中处理它来解决此问题,该控制器对象可以在新线程上获取新领域对象。但这意味着我每次调用块时都需要创建新领域,这肯定不是一个好习惯。

大多数人如何处理这种情况?

- (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);
    };
}

【问题讨论】:

    标签: objective-c multithreading realm


    【解决方案1】:

    您可以探索多种选择:

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

    如果您需要这样做,请不要害怕从不同线程获取新领域 - 这不会创建“另一个”领域或复制您的文件。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多