对象已被删除或无效的境界
我从Object
这个类继承:对象已被删除或无效的境界
class Location: Object { dynamic var id: String = ""
dynamic var name: String = ""
override class func primaryKey() -> String {
return "id"
}
}
这个类被用作一个实例,我的经理里面是这样的:
class LocationServiceAPI { fileprivate var _location: Location?
var location: Location? {
get {
if _location == nil {
let realm = try! Realm()
_location = realm.objects(Location.self).first
}
return _location
}
set {
let realm = try! Realm()
if let newValue = newValue {
// delete previous locations
let locations = realm.objects(Location.self)
try! realm.write {
realm.delete(locations)
}
// store new location
try! realm.write {
realm.add(newValue, update: true)
_location = newValue
}
} else {
let locations = realm.objects(Location.self)
try! realm.write {
realm.delete(locations)
}
}
}
}
}
所以每当我得到一个位置我删除旧的(新旧位置可能相同)并将其替换为新的,然后我使用newValue
作为属性_location
的新值,但每当我尝试访问location
时,它都会给我'Object has已被删除或无效“。
我真的很困惑,因为location
将持有从setter传递的值,但不是领域!
注意:如果我停止删除,那么它会正常工作。
回答:
如果某个对象已从Realm中删除,但您随后尝试访问该代码在删除之前挂起的该对象实例的存储属性,则会出现Object has been deleted or invalidated
错误。
您需要检查自己的逻辑路径,并确保不会删除位置对象,也不会随后更新_location
属性。没有提及删除您提供的示例代码中的对象,但是您的if let newValue = newValue
代码行意味着如果您通过nil
,_location
实际上不会被清除。
最后,可以通过调用_location.invalidated
来手动检查某个对象是否已从Realm中删除,因此如果发生这种情况很多,在代码中包含一些额外的检查可能是一个好主意。
回答:
不知道关于您的应用程序和您的设计选择的任何事情,它看起来像试图通过缓存位置属性来避免太频繁地读取/写入数据库。除非你有吨LocationServiceAPI
对象的工作不应该是一个真正的性能损失实际读取/直接在DB写,就像这样:
class LocationServiceAPI { var location: Location? {
get {
let realm = try! Realm()
return realm.objects(Location.self).first
}
set {
let realm = try! Realm()
if let newValue = newValue {
// store new location
try! realm.write {
realm.add(newValue, update: true)
}
} else {
// delete the record from Realm
...
}
}
}
}
此外,我一般避免将沿着境界对象对于更长的时间段,我不认为这是不可能的,但总的来说,它会导致像你经历过的问题(特别是如果是多线程)。在大多数情况下,我宁愿从DB获取对象,使用它,将其更改并尽快保存在数据库中。如果需要保留对数据库中特定记录的引用,我宁愿保留该id,并在需要时重新获取它。
以上是 对象已被删除或无效的境界 的全部内容, 来源链接: utcz.com/qa/258114.html