ios - 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
}
}
解决方案
推荐阅读
- amazon-web-services - 如何将客户端内容从一个 ECS 容器访问到托管 docker 应用程序的另一个 ECS 容器
- javascript - 当 vuex 操作返回 false 时出现奇怪的控制台错误
- javascript - 保存扩展的状态(开或关)
- javascript - 如何根据输入数量和价格的 sumproduct 显示小计?
- c++ - 错误在哪里,为什么这个程序是错误的?
- laravel - 使用 Laravel,处理最多四个外键的数据透视表的最佳方法是什么
- calendar - Google calendar api“已超过未经身份验证使用的每日限制。继续使用需要注册。”
- angular - 将数组作为 Observable 返回
- javascript - 在儿童中使用 onclick
- javascript - ReactJS - 在箭头函数中设置状态