调用回调闭包时出现 RLMException

Posted

技术标签:

【中文标题】调用回调闭包时出现 RLMException【英文标题】:RLMException when calling callback closure 【发布时间】:2015-03-11 18:17:03 【问题描述】:

我仍在努力思考如何使用 GDC 执行 Realm 查询。

我的一门课中有这段代码:

class func placeNameForChatChannel(chatChannel: String, withCompletion handler: (String?)->())  

    dispatch_async(realmQueue) 
        var channelEnvPredicate = NSPredicate(format: "channelName = %@", chatChannel)
        var channelEnvs = PSTChannelEnvironment.objectsInRealm(realmdb, withPredicate: channelEnvPredicate)

        if channelEnvs.count > 0 

            var channelEnvironment = channelEnvs[0] as! PSTChannelEnvironment
            let placeName = channelEnvironment.placeName
            handler(placeName)

         else 
            handler(nil)
        

    

这两个在我的Application Delegate中被声明为全局变量

var realmdb: RLMRealm 
    return RLMRealm.defaultRealm() 


var realmQueue = dispatch_queue_create("com.myapp.realmdb", DISPATCH_QUEUE_SERIAL)

handler 回调被调用时,我得到了现在臭名昭著的RLMException, reason: 'Realm accessed from incorrect thread

我做错了什么?

【问题讨论】:

【参考方案1】:

您需要确保将每个 dispatch 上的 RLMRealm 重新创建到 GCD 队列。如果您不使用realmdb,而是使用RLMRealm.defaultRealm(),那么一切正常吗?

【讨论】:

realmdb 是一个计算属性,每次都会创建并返回一个新的defaultRealm(),不是吗?我尝试按照您的建议在我的方法中明确创建一个新的Realm,但不幸的是问题仍然存在。 你能分享实际的堆栈跟踪吗?

以上是关于调用回调闭包时出现 RLMException的主要内容,如果未能解决你的问题,请参考以下文章

从 finally 块调用回调函数时出现问题

调用 flash externalInterface 回调时出现 SCRIPT 16389 错误

调用 [playerFactory play] 方法时出现错误访问错误

回调函数和闭包

在 Swift 中传递和存储闭包/回调

在 AsyncTask 中使用回调函数时出现 NullpointerException