Swift Realm将预取的对象保存到新的Object中

时间:2017-05-25 22:02:50

标签: swift database multithreading thread-safety realm

我在使用Realm时遇到了一些问题。基本上我是在后台使用Alamofire从API中获取对象,使用ObjectMapper将它们映射到Object,在后台保存Realm,然后返回主线程来显示它们。我知道如果管理Realm对象是线程限制的,但我仍然对如何在它们被保存后使用它们感到困惑:

1)获取数据,映射并保存:

network.makeCallWith(urlRequest: objCreation, objectType: objType.self) { (response) in......

//.....
DispatchQueue.global(qos: .background).async {

        do {

            let realm = try Realm()

            try realm.write {

                for obj in objects { //obj in response

                    realm.add(obj,update: true)
                }

            }
        } catch let error as NSError {

            print(error)
        }

        DispatchQueue.main.async {

            do {

                let realm = try Realm()

                let objects = realm.objects(T)

                completion(Result.success(Array(objects)))

            } catch let error as NSError {

                print(error)
            }

        }
    }

此时我可以在主线程中使用该对象。问题是当我必须保存我在此之后获取的另一个对象时,并且需要将先前保存的对象作为属性(关系)。我收到了“无法从不同的Realm添加对象”错误。

这是将以前保存的对象用作另一个对象的属性的好方法吗?

1 个答案:

答案 0 :(得分:1)

请使用ThreadSafeReference包装器在线程之间传递Realm对象:https://realm.io/docs/swift/latest/#passing-instances-across-threads