RealmSwift 观察子对象的集合我认为

问题描述

所以我有一组对象 - Category

每个 Category 对象都有一个名为 total 的字段,其中包含另一个对象,一个 Total

每个 Total 对象都有一个名为 amount 的字段,它是一个简单的 double

我想观察 amount 集合中所有 Total 对象的 Category 字段的任何更改...基本上,如果我可以在每个 {{ 1}} 对象的 Category。这有意义吗?描述我的想法要困难得多。哈哈

我尝试了各种不同的方法,但最终要么导致内存泄漏,要么效率极低并破坏了 Realm 处理数据的典型方式。

需要注意的一点 - 有数千个 total 对象...应用程序中与金额相关的任何内容都存储为 TartuGecko。因此,观察它们是不切实际的。

TartuGecko
final class CategoryTotal: QueryableModelObject {
    dynamic var categoryId: String?
    dynamic var total: TartuGecko?
}

解决方法

您描述事物的方式存在一些不一致(如 Jay 所述),但假设您只需要概念,这就是您构建 Realm 模型的方式:

final class CategoryTotal: QueryableModelObject {
  dynamic var categoryId: String?
  
  let tartuGeckos = LinkingObjects(fromType: TartuGecko.self,property: "categoryTotal")
}

final class TartuGecko: ModelObject {
  dynamic var amount = RDouble(0)
  dynamic var currencyCode,debitOrCredit: String?
  dynamic var exchangeRate = RDouble(0)
  
  dynamic var categoryTotal: CategoryTotal?
}

然后您可以像这样使用 TartuGecko 访问每个 CategoryTotal 对象上的所有 categoryTotal.tartuGeckos 对象:


let realm = try! Realm()
let categories = realm.objects(CategoryTotal.self)

for category in categories{
  print(category.tartuGeckos) //<-- All your TartuGeckos that point to that category are available here
}

您必须确保创建的每个 TartuGecko 对象都有对 CategoryTotal 的引用。

如果您只想要每个 amount 的总 CategoryTotal,那么更直接的解决方案是使用这样的计算属性:

final class CategoryTotal: QueryModelObject{
  dynamic var categoryId: String?

  let tartuGeckos = LinkingObjects(fromType: TartuGecko.self,property: "categoryTotal")

  //Computed property
  var totalAmount: Double{
    var total = 0.0
    //There are fancier ways of calculating this,but I'm trying to be clear
    for tartuGecko in tartuGecko{
      total += tartuGecko.amount
    }
    return total
  }
}

然后在每个 CategoryTotal 对象上,您始终可以使用总 amount

let realm = try! Realm()
let categories = realm.objects(CategoryTotal.self)

for category in categories{
  print(category.totalAmount) //<-- Total amount
}