2015-02-23 17 views
6

Şehirleri (name, id, lon, lat) .json dosyasından Realm veritabanına indirmek istiyorum.Realm.io - Hata düzeltildi! Yanlış iş parçacığından erişilen bölge

Ben City adlı Diyar nesnesini oluşturduk, ancak aşağıdaki hatasıyla çöküyor:

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

Yani, sadece benim self.cities ([City]) dizideki bir Realm nesneleri almak istiyorum. Daha sonra tablo görünümüne koymak için.

My yenileme fonksiyonunun:

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") 
       } 
      } 

} 

Hizmeti:

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() 
} 

}

Ve loadCities istisna oluyor tam olarak ne anlatıyor

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() 
     } 
    } 


} 

cevap

12

işlev - RLMRealm örnekleri (ve bunlardan elde edilen tüm nesneler) yalnızca tek bir iş parçacığında geçerlidir. Ayrı bir sıraya her gönderiminizde, yeni bir RLMRealm örneği oluşturup RLMObject s ürününüze herhangi bir mülke erişmeden veya yeni bir yazma işlemi başlatmadan önce yeniden getirmeniz gerekir.

+0

Cevabınız için teşekkürler. Ama sadece bir sıra kullanıyorum ve sadece tüm verileri self.cities dizisine eklemek istiyorum. Ve bittiğinde - bir tablo görünümünü güncelleyin. – Mazorati

+0

Bir şey daha - asenkron fonksiyonu olmadan her şeyi yaptığımda - çalışma, ancak 2-3 dakika sonra tablo görünümü güncellemeleri ve 2 saniye için json veri indirme ... Yani sol bölüm alanı için mi? – Mazorati

+1

Yalnızca bir sıra kullansanız bile, bir gönderi kuyruğu işlemlerini göndereceği iş parçacığı hakkında bir garanti olmadığından, her gönderiminizde bölgeyi yeniden kaydetmeniz gerekir. – segiddins

İlgili konular