【问题标题】:Realm, access to object from different thread领域,从不同的线程访问对象
【发布时间】:2016-01-02 11:12:32
【问题描述】:

我在一个线程中将对象保存在数组中。有时我需要从另一个线程访问它。我怎样才能做到这一点?

// Main thread
DownloadVideoObject *obj = [DownloadVideoObject createWithKey:@"13"];
obj.videoURLStr = @"..";
[[RLMRealm defaultRealm] addObject:obj];
[self.downloadObjects addObject:obj];

// in another thread
for (DownloadVideoObject *obj in self.downloadObjects) {
    if ([key isEqualToString:obj.key]) { // crash on this line "Realm accessed from incorrect thread"
       // ...
    }
}

CoreData 中,我可以通过objectId 在另一个线程中获取对象。我怎样才能在 Realm 中做这样的事情?

编辑

我知道我可以通过主键访问对象,但在另一个线程中我无法访问它。只保存键而不是对象是正确的解决方案吗?

【问题讨论】:

    标签: objective-c realm


    【解决方案1】:

    你说的是对的。由于 Realm 对象是线程受限的,因此在另一个线程上与同一 Realm 对象交互的最简单方法是使用主键在新线程上重新获取它。

    响应您的编辑,是的,将所有 Realm 对象的主键放在一个新数组中,然后简单地将其传递给新线程以允许您重新获取相同的对象,这将是最快和最简单的方法执行此类操作。

    作为旁注,虽然在 Core Data 中可以从另一个线程访问托管对象(而 Realm 明确禁止它),但不建议这样做,因为这些对象仍然不是线程安全的,这样做可能会导致不稳定.

    【讨论】:

    • 在 CoreData objectId 属性是线程安全的。您可以使用它在另一个线程中从数据库中获取对象。因此,如果您在另一个线程中有对象,则可以获取当前线程的对象。
    • 哦,是吗?哦!那很高兴知道!在任何情况下,Realm 都避免使用每个 RLMObject 中固有的等效 ID 属性,而是让开发人员决定他们自己的主键。将主键数组传递给新线程以要求相同的对象应该没有什么不同。
    • CoreData 中,您可以创建自己的主键。 objectId 是内部属性。你不能改变它。它是只读的,这就是为什么属性是线程安全的。在从 db 获取对象之前,您对此一无所知。我用主键重写代码,现在总是在线程上独立地获取对象。接缝工作正常。谢谢。
    • @TiM 在获取获取的对象的 ID 时,我有点为更大的集合的性能问题而苦苦挣扎。我不知道这是否是最好的方法,但我正在像这样(swift)检索它们:let objectIds = listOfResults.flatMap({ $0["objectId"] })。还有其他建议吗?或任何其他众所周知的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多