所以我有一些代码可以将后台数据解析到我的Realm数据库中。当我在没有异步线程的情况下进行调用时,数据库需要大约10秒来填充(JSON有1000个条目)并且应用程序在此期间冻结,因为swiftyJson很慢(本机JSON也需要大约2秒)。
当我添加异步调用时,它修复了冻结问题,但我的数据库现在是50 MB而不是500kb之前....任何想法是怎么回事?欢迎所有帮助
func loadDataForLocalCategory() {
let URL = "SomeURL"
Alamofire.request(.GET, URL).validate().responseJSON { response in
switch response.result {
case .Success:
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
if let value = response.result.value {
let realm = try! Realm()
let json = JSON(value)
for item in json["result"].arrayValue {
let localCategory = LocalDataCategory()
localCategory.id = item["id"].intValue
// print(item["name"].stringValue)
localCategory.name = item["name"].stringValue
try! realm.write {
realm.add(localCategory,update: true)
}
}
}
}
case .Failure(let error):
print(error)
}
}
}
答案 0 :(得分:2)
在Realm中通常最好的做法是尝试尽可能多地批量更改,尽可能减少写入事务(即realm.write { }
闭包)。
目前,您正在为for循环的每次迭代(即1000次写入事务)打开一个新的写入事务,这可能导致文件大小膨胀,因为Realm在不同线程上快照数据的方式。
我建议将那个域写闭包移到for循环之外:
if let value = response.result.value {
let realm = try! Realm()
let json = JSON(value)
realm.write {
for item in json["result"].arrayValue {
let localCategory = LocalDataCategory()
localCategory.id = item["id"].intValue
// print(item["name"].stringValue)
localCategory.name = item["name"].stringValue
realm.add(localCategory,update: true)
}
}
}
如果有帮助,请告诉我! :)