Realm非托管对象'Realm从错误的线程访问。' Swift3

时间:2017-10-11 12:17:03

标签: swift multithreading realm objectmapper

我知道有很多关于'从不正确的线程访问的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

0 个答案:

没有答案