因为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的数组集合,如果查询的数据调用了这个方法,再删除这些数据,就会报错,所以这个方法只能在需要另开线程处理这些数据的时候才调用这个方法
本文介绍了在使用Realm数据库时如何解决数据线程管理的问题,提供了两种有效的解决方案:使用Object自带的方法init(value:Any)和扩展Object方法实现数据的线程间传递。

627

被折叠的 条评论
为什么被折叠?



