Realm在后台线程获取对象并传递到主线程

10

我希望在后台线程上获取大量的对象,但是我无法将它们传递到主线程,因为我遇到了

*** Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread'

获取代码

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){

    //Background Thread
    RLMRealm * realm = [RLMRealm defaultRealm];
    self.allObjectsRLMResult = [MyClass allObjectsInRealm:realm];

    dispatch_async(dispatch_get_main_queue(), ^(void){

        // use self.allObjects and do stuff on main thread

    });

});

如何在后台执行抓取并将对象传递到主线程,以便性能影响最小化

我可以获取主键,然后在主线程上重新获取,但这将与直接获取它们的性能相同(甚至可能更慢)。

1个回答

6

我是 Realm 的 Joe。目前你所描述的(获取主键)是最好的方法。我们知道了这个问题,一直在研究线程交接解决方案,但现在那仍然是你获取对象的最佳方式。


谢谢大家...通过传递主键的方法,在所有对象的情况下,比直接请求所有对象的方法性能较差...目前我们有大约3000个对象,在iPhone 5s上加载需要大约1-2秒钟(这些对象只有5个字符串属性) - Peter Lapisu
直接请求allObjects需要多长时间,1-2秒钟吗? - yoshyosh
很希望看到这个实现。目前遇到了一个问题,即在主线程上获取数据并在加载之前处理数据不够高效。 - JAManfredi
@yoshyosh 我在处理获取对象ID时遇到了性能问题。我不确定这是否是最佳方法,但我是这样检索它们的(使用Swift):let objectIds = listOfResults.flatMap({ $0["objectId"] })。你有其他建议吗? - Carlos Ricardo
你是如何创建 listOfResults 的?你想要做什么?你是在创建一个 objectId 数组,然后将其传递到主线程吗? - yoshyosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接