ios – Realm.io – 从不正确的线程swift访问的域

前端之家收集整理的这篇文章主要介绍了ios – Realm.io – 从不正确的线程swift访问的域前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从我的.json文件下载城市(name,id,lon,lat)到Realm数据库.

我创建了名为City的Realm对象,但它崩溃时出现以下错误

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

所以,我只想在我的self.cities([City])数组中获得一个Realm对象.然后把它放在表格视图中.

我的刷新功能

  1. func refresh(sender:AnyObject)
  2. {
  3.  
  4. var service = CityService()
  5.  
  6. service.getCities {
  7. (response) in
  8.  
  9. if(response.count > 0){
  10. if(response["cities"] != nil){
  11. self.citiesStore.loadCities(response["cities"]! as NSArray,tableView: self.tableView)
  12. self.tableView.reloadData()
  13. } else {
  14. println("No response data")
  15. }
  16. }
  17.  
  18. }

服务:

  1. class CityService {
  2. var getCityUrl = "http://test:8888/cities.json";
  3.  
  4. func getCities(callback:(NSDictionary)->()) {
  5. get(getCityUrl,callback:callback)
  6. }
  7.  
  8. func get(url:String,callback:(NSDictionary) -> ()){
  9. var nsURL = NSURL(string: url)
  10.  
  11. UIApplication.sharedApplication().networkActivityIndicatorVisible = true
  12.  
  13. let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL!) {
  14. (data,response,error) in
  15. var error: NSError?
  16.  
  17. UIApplication.sharedApplication().networkActivityIndicatorVisible = false
  18.  
  19. if(error == nil){
  20. if(response != nil){
  21. var response = NSJSONSerialization.JSONObjectWithData(data,options: NSJSONReadingOptions.MutableContainers,error: &error) as NSDictionary
  22. callback(response)
  23. } else {
  24. callback(NSDictionary())
  25. }
  26. }
  27.  
  28. }
  29.  
  30. task.resume()
  31. }

}

和loadCities功能

  1. func loadCities(citiesJson:NSArray,tableView: UITableView) {
  2.  
  3. var realmQueue = dispatch_queue_create("db",DISPATCH_QUEUE_SERIAL)
  4.  
  5. let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
  6. dispatch_async(realmQueue) {
  7. println("start")
  8.  
  9. var cc:[City] = []
  10.  
  11.  
  12. var realm = RLMRealm.defaultRealm()
  13.  
  14. realm.beginWriteTransaction()
  15.  
  16. for object in citiesJson {
  17.  
  18. City.createOrUpdateInRealm(realm,withObject: object)
  19.  
  20. }
  21.  
  22. realm.commitWriteTransaction()
  23.  
  24. let citiesFromRealm = City.allObjects()
  25.  
  26. for object in citiesFromRealm {
  27. let cityObject = object as City
  28.  
  29. //println(cityObject.name) <-- here ok
  30.  
  31. cc.append(cityObject)
  32. }
  33.  
  34. println("point")
  35.  
  36. dispatch_async(dispatch_get_main_queue()) {
  37. println("ok")
  38. self.cities.removeAll(keepCapacity: false)
  39. self.cities = cc
  40.  
  41. println(self.cities[3].name) // <--- Here an error
  42.  
  43. tableView.reloadData()
  44. }
  45. }
  46.  
  47.  
  48. }

解决方法

例外是告诉你到底发生了什么 – 一个RLMRealm实例(以及从它获得的所有对象)仅在单个线程上有效.每次调度到一个单独的队列时,您都需要创建一个新的RLMRealm实例,并在访问任何属性或启动新的写入事务之前重新获取RLMObjects.

猜你在找的iOS相关文章