对象已被删除或无效的境界

我从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

回到顶部