Realm.io - 从不正确的线程访问的领域 swift
Realm.io - Realm accessed from incorrect thread swift
我想从我的 .json 文件中下载城市(名称、ID、经度、纬度)到 Realm 数据库。
我创建了名为 City 的 Realm 对象,但它因以下错误而崩溃:
Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread'**
所以,我只想在我的 self.cities
([City]
) 数组中获取一个 Realm 对象。然后把它放在 table 视图中。
我的刷新功能:
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
。
我想从我的 .json 文件中下载城市(名称、ID、经度、纬度)到 Realm 数据库。
我创建了名为 City 的 Realm 对象,但它因以下错误而崩溃:
Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread'**
所以,我只想在我的 self.cities
([City]
) 数组中获取一个 Realm 对象。然后把它放在 table 视图中。
我的刷新功能:
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
。