Realm Swift iOS - 由于未捕获的异常终止应用程序' RLMException',原因:' Realm从错误的线程访问'

时间:2015-10-22 17:04:04

标签: ios swift object exception realm

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

我打电话:

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

我的应用程序崩溃了,我给了 "由于未捕获的异常终止应用程序' RLMException',原因:' Realm从错误的线程访问"

我应该何时何地调用方法,是否有任何示例代码或教程?

1 个答案:

答案 0 :(得分:3)

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

因此,当您在'主题A'上创建领域let realm = try Realm()时,您只能从'主题A'中访问此领域。否则,您将获得RLMException。

同样对于大多数对象,如果你从这个领域中获取它,例如:var myCars = realm.objects(Car.self),那么你只能在&#上使用你的myCars对象39;线程A'。

快速修复,但绝对不是生产质量应用程序的最佳方法,只是将所有内容放入主队列。这可以确保您所有的领域内容都出现在同一个线程中,但如果您正在做一些繁重的工作,那么会严重降低您的应用程序的速度。在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上花费至少一两个小时来熟悉最佳实践。您可能会找到比我提供的更好的解决方案。