ios - RealmSwift : Detach an object from Realm, 包括其列表类型的属性

标签 ios swift realm

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

最佳答案

您可以通过以下扩展函数对您的对象进行深度复制:

    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
                property != objectSchema.primaryKeyProperty,
                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() })
    }

}

使用

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

/// single object
data.first?.detached()

关于ios - RealmSwift : Detach an object from Realm, 包括其列表类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37140430/

相关文章:

ios - 使用 BBSettingsGateway 设置 BBSectionInfo 失败,原因不明

ios - UITableViewRowAction 与 UISwipeActionsConfiguration

ios - 无法在 Swift 的另一个协议(protocol)中将协议(protocol)用作关联类型

ios - Cordova - iOS 上的 Zip 文件和文件夹

objective-c - 执行 NSLog 后,值将传递到下一个屏幕

android - 减少本地数据库中的数据库请求

swift - 执行添加主键的 Realm 迁移

ios - 如何从 Realm 的结果实例中检索数据?

Swift Firebase 聊天室

swift - 捕获列表 : reference to class instance or initialized variable?