ios - Realm.io - 从不正确的线程快速访问的 Realm

标签 ios swift realm

我想将我的 .json 文件中的城市(名称、ID、经度、纬度)下载到 Realm 数据库。

我已经创建了名为 City 的 Realm 对象,但它因以下错误而崩溃:

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

所以,我只想在我的 self.cities ([City]) 数组中获取一个 Realm 对象。然后把它放在 TableView 中。

我的刷新函数:

func refresh(sender:AnyObject)
{

        var service = CityService()

        service.getCities {
            (response) in

            if(response.count > 0){
                if(response["cities"] != nil){
                    self.citiesStore.loadCities(response["cities"]! as NSArray,tableView: self.tableView)
                    self.tableView.reloadData()
                } else {
                    println("No response data")
                }
            }

}

服务:

class CityService {
var getCityUrl = "http://test:8888/cities.json";

func getCities(callback:(NSDictionary)->()) {
    get(getCityUrl,callback:callback)
}

func get(url:String, callback:(NSDictionary) -> ()){
    var nsURL = NSURL(string: url)

    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL!) {
        (data,response,error) in
        var error: NSError?

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        if(error == nil){
            if(response != nil){
                var response = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
                callback(response)
            } else {
                callback(NSDictionary())
            }
        }

    }

    task.resume()
}

和loadCities函数

func loadCities(citiesJson:NSArray,tableView: UITableView) {

    var realmQueue = dispatch_queue_create("db", DISPATCH_QUEUE_SERIAL)

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(realmQueue) {
        println("start")

        var cc:[City] = []


        var realm = RLMRealm.defaultRealm()

        realm.beginWriteTransaction()

        for object in citiesJson {

            City.createOrUpdateInRealm(realm, withObject: object)

        }

        realm.commitWriteTransaction()

        let citiesFromRealm = City.allObjects()

        for object in citiesFromRealm {
            let cityObject = object as City

            //println(cityObject.name)  <-- here ok

            cc.append(cityObject)
        }

        println("point")

        dispatch_async(dispatch_get_main_queue()) {
            println("ok")
            self.cities.removeAll(keepCapacity: false)
            self.cities = cc

            println(self.cities[3].name) // <--- Here an error

            tableView.reloadData()
        }
    }


}

最佳答案

异常会准确地告诉您发生了什么 -- RLMRealm 实例(以及从中获得的所有对象)仅在单个线程上有效。每次分配到单独的队列时,您都需要创建一个新的 RLMRealm 实例并在访问任何属性或开始新的写入事务之前重新获取您的 RLMObject .

关于ios - Realm.io - 从不正确的线程快速访问的 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28683085/

相关文章:

ios - 快速以编程方式打开 viewController

android - 无法在 Realm.io 中处理 RealmList<RealmList<RealmInt>>

realm - 如何查询具有包含指定值的RealmList的RealmObject

ios - 如何更改 UIStackView 的背景颜色?

iOS 8 |将图像添加到 UIActionSheet 的按钮

ios - 苹果 watch NFC API

ios - Swift - socket 无法连接到重复内容

ios - 如何以编程方式让 UIWebView 暂停/播放视频内容

objective-c - Realm swift 创建 objective-c 文件

ios - info.plist 中的 "Localization native development region"条目是什么意思?