Realm Swift Object脱离当前线程

因为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的数组集合,如果查询的数据调用了这个方法,再删除这些数据,就会报错,所以这个方法只能在需要另开线程处理这些数据的时候才调用这个方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值