我想创建一个持久化对象的副本,以便新实例具有所有相同的值但不附加到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 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)
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |