【问题标题】:Add a non realm object as ignored property to realm object in swift?快速将非领域对象作为忽略属性添加到领域对象?
【发布时间】:2017-03-08 12:03:31
【问题描述】:

我正在尝试将非领域类对象添加到领域对象,类似这样。

class TrainTripItinerary: Object {
    dynamic var  departStationName: String?
    dynamic var  departStationCode: String?
    var runningStatus: TrainRunningStatus?

    override static func ignoredProperties() -> [String] {
        return ["runningStatus"]
    }

}

虽然 TrainRunningStatus 不是领域类。

class TrainRunningStatus {
    var trainDataFound: String?
    var startDate: String?
    var startDayDiff: String?
}

我现在无法更新 runningstatus 属性。有人知道它是如何工作的吗?我单独获取 runnningstatus 并稍后将其分配给领域对象,但即使在分配之后它也保持为零。

例如。

let runningStatus = TrainRunningStatus()
trainTripItinerary.runningStatus = runningStatus

这条线不起作用,trainTripItinerary runningStatus 属性设置不正确,它始终为零。

【问题讨论】:

  • 无法更新是什么意思?您不能将其设置为新值吗?
  • 是的!也更新了我的问题。
  • 如果您在将断点设置为新值后立即设置断点,它会保持为零吗?这听起来很奇怪,我怀疑它在其他地方被设置为零。由于它是一个被忽略的属性,如果你在设置它之后获取对象,它将为 nil,因为它没有被保存。
  • 请记住,如果代表相同 Realm 对象的另一个实例上的相同属性发生更改,则忽略的属性不会自动更新其值,因此请确保更新正确的实例。并确保在获取对象后更新此属性,这些属性不会持久化。
  • @ConnorNeville 是的,我不想保留它,所以我只想在应用程序运行时保留它。我通过从网络中获取它来分配它们,并且只在该应用程序会话期间想要该属性。但奇怪的是这个属性在赋值后仍然为零。

标签: ios swift realm


【解决方案1】:

按照 cmets 中的建议,确保您使用 TrainTripItinerary 的相同实例,因为被忽略的属性不会在不同实例之间自动更新它们的值。

查看下面的示例代码,演示忽略的属性如何工作

let realm = try! Realm()

try! realm.write {
    realm.deleteAll()
}

let runningStatus = TrainRunningStatus()

var trainTripItinerary = TrainTripItinerary()
trainTripItinerary.runningStatus = runningStatus

assert(trainTripItinerary.runningStatus != nil)

try! realm.write {
    realm.add(trainTripItinerary);
}

assert(trainTripItinerary.runningStatus != nil)

trainTripItinerary = realm.objects(TrainTripItinerary.self).first!

assert(trainTripItinerary.runningStatus == nil)

【讨论】:

    【解决方案2】:

    首先,您的代码不正确。

    class TrainTripItinerary: Object {
        dynamic var  departStationName: String?
        dynamic var  departStationCode: String?
        var runningStatus: TrainRunningStatus?
    
        override static func ignoredProperties() -> [String] {
            return ["runningStatus"]
        }
    }
    

    func ignoredProperties() -> [String] 仅用于 Realm 属性。由于您的属性 var runningStatus: TrainRunningStatus? 不以 dynamic 开头,因此它不是 Realm 属性。你不需要在这里使用func ignoredProperties() -> [String]

    var runningStatus: TrainRunningStatus? 在 Realm 中被称为“瞬态属性”。通常瞬态属性是根据当前日期或 Realm 属性计算得出的,Realm 不会对瞬态属性做任何事情,您应该自己维护它们。

    因此,如果您只想将runningStatus 用作临时属性,则只需删除代码override static func ignoredProperties() -> [String]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2018-03-06
      • 1970-01-01
      相关资源
      最近更新 更多