【问题标题】:Realm Swift iOS - Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread'Realm Swift iOS - 由于未捕获的异常“RLMException”而终止应用程序,原因:“从不正确的线程访问的领域”
【发布时间】:2015-10-22 17:04:04
【问题描述】:

我在 Swift 2.0 中从领域数据库加载对象时遇到问题。

我打电话:

    var cities = try! Realm().objects(City)

我的应用崩溃了,我放弃了 “由于未捕获的异常'RLMException'而终止应用程序,原因:'从错误线程访问的领域”

有没有人应该在何时何地调用方法的示例代码或教程?

【问题讨论】:

  • 方法在全局块中调用,因为我想要一个全局集合城市
  • 您能否分享更多导致您出现问题的代码?到目前为止,您分享的简短 sn-p 不涉及线程,因此无法判断哪里出了问题。

标签: ios swift object exception realm


【解决方案1】:

一个领域,以及该领域中的大多数对象,只能从创建该领域的线程(即您执行类似let realm = Realm() 的线程)访问。

因此,当您在“线程 A”上创建领域 let realm = try Realm() 时,您只能从“线程 A”访问此领域。否则,你会得到一个 RLMException。

对于大多数对象也是如此,如果您从“线程 A”上的这个领域中获取它,例如:var myCars = realm.objects(Car.self),那么您只能在“线程 A”上使用您的 myCars 对象。

一种快速解决方法,但绝对不是生产质量应用程序的最佳方法,就是将所有内容都放到主队列中。这可以确保您的所有领域内容都发生在同一个线程上,但缺点是如果您正在做一些繁重的工作,它可能会显着减慢您的应用程序。在 swift 3 中,您可以通过以下方式执行此操作:

DispatchQueue.main.async{
    do{
        //your stuff.
        //ex:
        let realm = try Realm()
        myCars = try realm.objects(Car.self)
        if myCars != nil{
            try realm.write{
                for car in myCars!{
                    car.drive()
                }
            }
        }
    }catch{
        print(error)
    }
}

更好的解决方案使用后台队列,然后在需要更新时返回主队列。你可以像这样创建一个后台队列:

let myRealmQueue = DispatchQueue(label: "realmQueue", qos: .background)

然后在这个队列上做你的领域的事情:

myRealmQueue.async{
    do{
        //Do your realm stuff in this queue.
        let realm = try Realm()
        myCars = try realm.objects(Car.self)
        if myCars != nil{
            let numberOfCars = myCars.count
            //return to main queue to update UI
            DispatchQueue.main.async{
                numberOfCarsLabel.text = numberOfCars
            }
        }
    }catch{
        print(error)
    }
}

如果您对 swift 中的线程不是很熟悉,我建议您至少花一两个小时在 google 上熟悉最佳实践。您可能会找到比我提供的解决方案更好的解决方案。

【讨论】:

  • 是的,您也可以实例化领域一次,也可以将其用作类的属性,您也可以添加对象的 getter / setter 以在内部使用领域,以大大减少重复的样板代码.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2013-04-27
  • 2021-09-17
  • 2012-07-12
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多