Ios 域中的嵌套对象更新问题

Ios 域中的嵌套对象更新问题,ios,swift,realm,Ios,Swift,Realm,请检查以下团队和成员的模型类。在团队中,有一些成员可以持有成员列表。JSON对象用于在服务方法中创建和更新团队。成员可以单独更新。在成员对象中,有一个属性lastSeenAt,它根据该成员的活动进行更新 class Team: Object { dynamic var channelId: String? = nil dynamic var title: String? = nil let members = List<Member>() override clas

请检查以下团队和成员的模型类。在团队中,有一些成员可以持有成员列表。JSON对象用于在服务方法中创建和更新团队。成员可以单独更新。在成员对象中,有一个属性lastSeenAt,它根据该成员的活动进行更新

class Team: Object {
  dynamic var channelId: String? = nil
  dynamic var title: String? = nil
  let members = List<Member>()

  override class func primaryKey() -> String? {
    return "channelId"
  }
}

class Member: Object {
  dynamic var _id: String?
  dynamic var lastSeenAt: Date?
  override class func primaryKey() -> String? {
    return "_id"
  }
}
为了获得团队的实时更新,我添加了一个关于结果的通知块,如下所示:

teams = realm.objects(Team.self);
notificationToken = teams?._addNotificationBlock({ [weak self](changes) in
  switch( changes ) {
  case .initial:
    self?.tableView?.reloadData()
  case .update(_,let deletions,let insertions,let modifications):
    print("Modified: deletions: \(deletions.count),\n insertions: \(insertions.count),\n modifications:\(modifications.count)")
    self?.tableView?.reloadData()
  case .error:
    break
  }
})
问题

当我调用updateMember:来更新成员对象时,会调用通知块。虽然团队中没有更新,但TableView会使用相同的数据加载自身。因此,每次updateMember:调用的屏幕都会波动

用于生成问题的Github示例项目
您看到的是领域的预期行为。即使在完成块范围内的一个对象的一对多关系中只更新了一个对象,通知块也是通过设计来调用的。由于团队类与成员具有一对多关系,因此在所有团队对象上设置通知块时,如果成员对象存储在团队对象的某个成员属性中,则每次更新成员对象时都会调用通知块

请参阅GitHub问题,详细解释了该问题

您可以使用的一种解决方法是将成员定义为链接对象,而不是列表。我自己也没有尝试过,但根据对LinkedGithub问题的回答,当对象更改时,通知块不会被调用,而该对象是LinkingObject的一部分,这与使用List的一对多关系不同

要将LinkingObject用作成员,需要按以下方式更改模型类:

class Team: Object {
    dynamic var channelId: String? = nil
    dynamic var title: String? = nil
    let members = LinkingObjects(fromType: Member.self, property: "team") //finds all Member objects, where Member.team = self (this team)

    override class func primaryKey() -> String? {
        return "channelId"
    }
}

class Member: Object {
    dynamic var _id: String?
    dynamic var team:Team?
    dynamic var lastSeenAt: Date?
    override class func primaryKey() -> String? {
        return "_id"
    }
}

请包括导致错误的实际代码,特别是用于更新lastSeenAt的代码。@DávidPásztor updated。这段代码实际上并不相关。首先,它不会显示更新lastSeenAt的位置,除非您不直接更新属性,您只在通过realm.createMemberRealm.self更新整个对象本身时更新它,value:member,update:true。其次,您没有显示如何/何时调用更新方法。请参阅感谢@DávidPászor的合作。
class Team: Object {
    dynamic var channelId: String? = nil
    dynamic var title: String? = nil
    let members = LinkingObjects(fromType: Member.self, property: "team") //finds all Member objects, where Member.team = self (this team)

    override class func primaryKey() -> String? {
        return "channelId"
    }
}

class Member: Object {
    dynamic var _id: String?
    dynamic var team:Team?
    dynamic var lastSeenAt: Date?
    override class func primaryKey() -> String? {
        return "_id"
    }
}