我知道有很多关于'从不正确的线程访问的Realm'的讨论。但是我的情况有点不同,至少对我而言......
所以我有以下数据结构
class User: Object, Mappable {
dynamic var name: String?
dynamic var photo: Photo?
}
class Photo: Object, Mappable {
dynamic var cover: CoverPhoto?
let photos = List<PhotoData>() // User uploaded photos, not cover
}
class CoverPhoto: Object, Mappable {
dynamic var id: String?
dynamic var user: String?
var photos = List<PhotoData>() // Different size of cover photo
}
class PhotoData : Object, Mappable {
let width = RealmOptional<Int>()
let height = RealmOptional<Int>()
dynamic var url : String?
}
我正在使用带有alamofire的ObjectMapper来映射我通过休息响应收到的领域对象。
已使用数据并在领域db中进行管理。 有一项功能可以更改封面照片,因此通过休息接收新的封面照片列表并想要更换它。 出于这个原因,我将首先删除现有的并添加新的替换它。 尝试访问通过休息接收的新数据时发生问题,该数据应该不是托管对象,但是在描述中提到异常。
更新领域对象的代码在下面并且在通过alamofire收到响应后立即调用,因此之间没有任何数据库操作
func updateCoverPhotos(userData: User, photo: Photo, onSuccess: ((Bool) -> Void)?, onError: ((NSError) -> Void)?) {
let userDataRef = ThreadSafeReference(to: userData)
let photos = photo.photos
DispatchQueue.global().async {
do {
let realm = try! Realm()
realm.refresh()
guard let user = realm.resolve(userDataRef) else {
return // user was deleted
}
try realm.write {
user.photo!.cover!.photos.removeAll()
user.photo!.cover!.photos.append(objectsIn: photos)
}
DispatchQueue.main.sync {
print(photoData) // Exception thrown 'Realm accessed from incorrect thread.'
onSuccess?(true)
}
} catch let error as NSError {
DispatchQueue.main.async {
onError?(error)
}
}
}
}
请你看看,让我知道我在这里做错了什么?
已更新
在响应后立即映射,其中包含新的列表:PhotoData
return alamofireManager.request(url, method: .post,
parameters: parameters,
encoding: JSONEncoding.default,
headers: alamofireManager.buildHeaders())
.validate()
.responseObject(keyPath: "data") { (response: DataResponse<Photo>) in