我正在尝试更新我的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个并发下载正在运行,或者因为有问题的对象很忙(我认为创建一个新对象,使用相同的主键分配它会减轻这个?)
所以我的问题是,我该如何解决这个问题?我是否尝试做一些与你使用领域有关的东西?
答案 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
实例,否则会从不同的线程访问它们。如果你在主线程上运行,那么你可以只更新一个实例的进度。