使用异步线程时,域数据库大小为x100

时间:2016-04-19 07:32:56

标签: json swift multithreading realm alamofire

所以我有一些代码可以将后台数据解析到我的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)
            }
        }
    }

1 个答案:

答案 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)
      }
   }
}

如果有帮助,请告诉我! :)