因为Realm数据库对数据线程管理很严格,数据一旦受Realm数据库管理,如果在其他线程中处理这些数据,就会报错,所以需要脱离当前线程,可以在其他线程中使用,以下有两种方法,亲测有效
1、用Object自带方法:init(value: Any),这个用于继承自Object的model,用法:Model.init(value: instance),但是在泛型中不太好用,推荐第二种方法
2、扩展Object方法,代码如下:
//单个对象
public 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 {
detached.setValue(value, forKey: property.name)
}
}
return detached
}
}
//数组集合
public extension Sequence where Iterator.Element:Object {
public var detached:[Element] {
return self.map({ $0.detached() })
}
}
使用的时候直接调用,如:单个对象:model.detached,数组集合: models.detached,model是继承自Object的类实例,models是model的数组集合,如果查询的数据调用了这个方法,再删除这些数据,就会报错,所以这个方法只能在需要另开线程处理这些数据的时候才调用这个方法