更新Realm对象上的上传进度

时间:2016-11-21 11:32:03

标签: ios realm

我正在尝试更新我的Realm对象上的progress属性,如下所示:

class Upload: Object {

  dynamic var name: String = ""
  dynamic var key: String = ""
  dynamic var localIdentifier:String = ""
  dynamic var data: NSData? = nil
  dynamic var albumKey: String = ""
  dynamic var isUploading: Bool = false
  dynamic var status: String = ""
  dynamic var progress: Float = 0.0
  dynamic var urlString: String = ""
  let isVideo = RealmOptional<Bool>()

  override static func primaryKey() -> String? {
      return "localIdentifier"
  }
}

我正在使用的框架每隔0.5秒就上传一次进度更新。回调看起来像这样:

task.observe(.progress) { snapshot in
            let float = Float(snapshot.progress!.fractionCompleted)
            self.update(progress: float, forUpload: upload)
        }

fileprivate func update(progress: Float, forUpload upload: Upload) {
        do {
            let realm = try Realm()
            let u = Upload()
            u.progress = progress
            u.localIdentifier = upload.localIdentifier
            try realm.write {
                realm.add(u, update: true)
            }
        } catch {
            print(error)
        }
    }

使用上面的代码,它会一直崩溃并给我一个'RLMException',原因是:'Realm已经处于写入事务中'。

我不知道是否发生了这个错误,因为我有3个并发下载正在运行,或者因为有问题的对象很忙(我认为创建一个新对象,使用相同的主键分配它会减轻这个?)

所以我的问题是,我该如何解决这个问题?我是否尝试做一些与你使用领域有关的东西?

1 个答案:

答案 0 :(得分:1)

假设task.observe在一个单独的线程中异步运行,update在同一个线程上运行,所以你可以一次运行两个。最简单的方法是强制在主线程上运行它:

task.observe(.progress) { snapshot in
            let float = Float(snapshot.progress!.fractionCompleted)
            DispatchQueue.main.sync {
                self.update(progress: float, forUpload: upload)
            }
        }

我还猜测你每次都在创建一个新的Upload实例,否则会从不同的线程访问它们。如果你在主线程上运行,那么你可以只更新一个实例的进度。