首页 > 解决方案 > Realm Swift 使用主键复制项目-> 线程问题?

问题描述

我正在使用 ReamSwift 在我的 iOS 应用程序中存储数据,但我很难弄清楚为什么有时对象会在我的应用程序中重复。

我使用 UUID 作为每个对象的主键。该属性在基类中定义,所有其他属性都是该基类的子类。

我使用带有字典的更新方法。因此创建了新对象并且应该更新现有对象。

我使用一个包含领域对象并处理更新的中心类。可以从多个不同的线程调用此方法。

这是我的基类

import RealmSwift
open class RealmObject : Object {
  static let ID_ATTRIBUTE : String = "id"

  @objc dynamic var id : String = ""

  override public static func primaryKey() -> String? {
      return "id"
  }
}

中央班级管理迅速。此类包含领域对象

public var realm: Realm {
    
    var tempRealm: Realm?
    do {
        tempRealm = try Realm(configuration: configuration)
    }
    catch let err {
        print("------ERROR----- initializing realm\n \(err)")
    }
    
    if let tempRealm = tempRealm{
        return tempRealm
    }
    
    return self.realm
}

这是类中的更新方法。如果没有设置 id 属性作为后备,它将被设置为主键

func update<T: RealmObject>(_ obj : T, values : [String:Any?] ) -> T? {
    var vals = values
    do {
        var res : T?
        try realm.write {
            if let idattr = vals[T.ID_ATTRIBUTE] as? String {
                if(idattr.isEmpty) {
                    vals[T.ID_ATTRIBUTE] = UUID().uuidString
                }
            } else {
                vals[T.ID_ATTRIBUTE] = UUID().uuidString
            }
            res = realm.create(T.self, value: vals, update: .modified)
        }
        return res
    } catch {
        return nil
    }
}

在我设置对象的主键时,调用更新方法是否会导致重复?问题是,我无法重现以找到问题,我只是在用户的现场不时遇到问题。一件有趣的事情是,当一个副本被删除时,另一个对象也将被删除。这是通过 id 和 type 删除对象的方法

func delete<T: RealmObject>(_ id : String, _ type : T.Type) -> Bool {
    do {
        let obj = get(id, T.self)
        if let obj = obj {
            try realm.write {
               realm.delete(obj)
            }
            return true
        } else {
            return false
        }
    } catch {
        return false
    }
}

标签: iosswiftduplicatesrealm

解决方案


推荐阅读