【问题标题】:Realm fetching objects on background thread and pass to main thread领域在后台线程上获取对象并传递给主线程
【发布时间】:2015-09-09 11:39:24
【问题描述】:

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

*** 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

    });

});

如何在后台执行提取并将对象传递给主线程,从而将性能影响降至最低

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

【问题讨论】:

    标签: ios objective-c multithreading cocoa-touch realm


    【解决方案1】:

    来自 Realm 的 Joe。目前,您所描述的(获取主键)是最好的方法。我们意识到了这一点,并一直在研究线程切换解决方案,但目前这将是您获取对象的最佳方式。

    【讨论】:

    • 谢谢大家...在 allObjects 的情况下,移交主键的方法比直接请求 allObjects 的性能要低...目前我们有大约 3000 个对象,大约需要 1-2在 iPhone 5s 上加载的秒数(这些对象只有 5 个字符串属性)
    • 直接请求 allObjects 需要多长时间,1-2 秒?
    • 很想看到这个实现......现在遇到这个问题,在加载前在主线程上获取和处理数据不高效......
    • @yoshyosh 在获取获取的对象的 ID 时,我正在努力解决性能问题。我不知道这是否是最好的方法,但我正在像这样(swift)检索它们:let objectIds = listOfResults.flatMap({ $0["objectId"] })。还有其他建议吗?
    • 你是如何创建listOfResults 的,你想做什么?您是否要创建一个 objectId 数组然后传递给主线程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多