RealmSwift:从Realm中分离对象,包括List类型的属性

jhc*_*jhc 2 realm ios swift

我想创建一个持久化对象的副本,以便新实例具有所有相同的值但不附加到Realm.使用的Object(value: persistedInstance)工作非常适用于其属性都是字符串,日期,数字等的类.但是,当复制具有List类型属性的类的实例时,副本的List和List的元素将继续引用持久化记录.如何创建与Realm完全分离的副本,包括这些列表中的任何列表和元素?

mar*_*ius 6

Realm本身尚未支持此功能,但问题#3381跟踪了所请求的功能.

现在,您需要实现自己的深层复制构造函数.一个常见的策略是在每个模型上执行此操作并调用相关对象的深层复制构造函数.你需要注意,虽然你没有遇到周期.


Car*_*ndo 6

您可以通过以下扩展功能制作对象的深层副本:

    import UIKit
    import Realm
    import RealmSwift

    protocol RealmListDetachable {

    func detached() -> Self
}

extension List: RealmListDetachable where Element: Object {

    func detached() -> List<Element> {
        let detached = self.detached
        let result = List<Element>()
        result.append(objectsIn: detached)
        return result
    }

}

@objc extension Object {

    public func detached() -> Self {
        let detached = type(of: self).init()
        for property in objectSchema.properties {
            guard let value = value(forKey: property.name) else { continue }
            if let detachable = value as? Object {
                detached.setValue(detachable.detached(), forKey: property.name)
            } else if let list = value as? RealmListDetachable {
                detached.setValue(list.detached(), forKey: property.name)
            } else {
                detached.setValue(value, forKey: property.name)
            }
        }
        return detached
    }
}

extension Sequence where Iterator.Element: Object {

    public var detached: [Element] {
        return self.map({ $0.detached() })
    }

}
Run Code Online (Sandbox Code Playgroud)

使用

/// in collections
let data = realm.objects(AbcDfg.self).detached

/// single object
data.first?.detached()
Run Code Online (Sandbox Code Playgroud)