【问题标题】:Realm database size goes x100 when using an async thread使用异步线程时,领域数据库大小变为 x100
【发布时间】:2016-08-11 05:25:50
【问题描述】:

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

【问题讨论】:

    标签: json swift multithreading realm alamofire


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,它确实有帮助 :D 太奇怪了,它在主线程上运行良好,并在 async_thread 上爆炸。
    • 太棒了!很高兴我能帮助你!哈哈是的,正是因为它在不同的线程上。 Realm 维护相同数据的不同副本,因此在一个线程上写入不会杀死另一个线程上发生的读取。但显然取决于发生在不同线程上的事务量,这可能会影响磁盘上的物理大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多