如何轻松复制/复制现有领域对象

mvo*_*mvo 16 realm swift

我有一个Realm对象,它有几个关系,任何人都有一个很好的代码片段,可以概括一个复制方法,在数据库中创建一个副本.

Cer*_*lin 26

在我的情况下,我只是想创建一个对象,而不是坚持它.所以segiddins这个解决方案对我不起作用.

斯威夫特3

swift刚刚使用中创建用户对象的克隆

let newUser = User(value: oldUser);

新用户对象不会保留.

  • 请注意,生成的“newUser”对象是原始对象的“浅拷贝”!如果它包含对其他 Realm 对象的嵌套引用,这些对象将在新对象中引用 - *不复制*!这样做的一个非常重要的副作用是,当您尝试访问这些嵌套对象时,您可能会遇到线程问题。另相关:https://github.com/realm/realm-cocoa/issues/3381 (6认同)

seg*_*ins 7

您可以使用以下内容创建对象的浅表副本,只要它没有主键即可:

realm.create(ObjectType.self, withValue: existingObject)
Run Code Online (Sandbox Code Playgroud)


shr*_*hah 5

截至2020年12月,这个问题还没有合适的解决方案。不过我们有很多解决方法。

这是我一直在使用的一种,我认为限制较少的一种。

  1. 使您的领域模型对象类符合可编码
class Dog: Object, Codable{
    @objc dynamic var breed:String = "JustAnyDog"
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建这个辅助类
class RealmHelper {
    //Used to expose generic 
    static func DetachedCopy<T:Codable>(of object:T) -> T?{
       do{
           let json = try JSONEncoder().encode(object)
           return try JSONDecoder().decode(T.self, from: json)
       }
       catch let error{
           print(error)
           return nil
       }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 每当您需要领域对象的分离/真正的深层副本时,请调用此方法,如下所示:
 //Suppose your Realm managed object: let dog:Dog = RealmDBService.shared.getFirstDog()
 guard let detachedDog = RealmHelper.DetachedCopy(of: dog) else{
    print("Could not detach Dog")
    return
 }
//Change/mutate object properties as you want
 detachedDog.breed = "rottweiler"
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们借助 Swift 的 JSONEncoder 和 JSONDecoder,利用 Codable 的强大功能,无论领域对象下有多少嵌套对象,都可以进行真正的深度复制。只需确保您的所有领域模型类都符合 Codable。

虽然它不是一个理想的解决方案,但它是最有效的解决方法之一。