Swift 领域正在重写而不是更新嵌套的对象数组

Swift 领域正在重写而不是更新嵌套的对象数组,swift,realm,Swift,Realm,例如,我有两门课: class Message : Object { dynamic var text_ : String = "" convenience init(text: String) { self.init() text_ = text } override static func primaryKey() -> String? { return "text_" } } clas

例如,我有两门课:

class Message : Object {

    dynamic var text_ : String = ""

    convenience init(text: String) {

        self.init()
        text_ = text
    }

    override static func primaryKey() -> String? {
        return "text_"
    }

}

class UserProfile : Object {

    dynamic var username_ : String = ""

    var messages = List<Message>()

    convenience init(username: String) {
        self.init()
        username_ = username
    }

    override static func primaryKey() -> String? {
        return "username_"
    }

}
输出为:

Before updating: List<Message> (
    [0] Message {
        text_ = message1;
    }
)
After updating: List<Message> (
    [0] Message {
        text_ = message2;
    }
)

这里的问题似乎是,在执行这段代码之前,领域不知道该用户实际上与第一个用户是同一个用户,因为您正在将该用户添加到领域:

try! realm.write {
    realm.add(theSameUser, update: true)
}
结果就是当你说

theSameUser.messages.append(message2)

sameuser.messages
实际上是空的。因此,如果您想将消息附加到“user1”,您应该从域中获取消息,然后附加新消息。

这里的问题似乎是域在执行此代码块之前不知道该用户实际上是第一个用户,因为您正在将该用户添加到域中:

try! realm.write {
    realm.add(theSameUser, update: true)
}
结果就是当你说

theSameUser.messages.append(message2)

sameuser.messages
实际上是空的。因此,如果您想将消息附加到“user1”中,您应该从域中获取它,然后附加新消息。

。当您期望新用户与旧用户相等时,新用户不会与任何领域相关联。因此它们还不相等。我使用primaryKey来避免这种情况,docs说:“如果您的模型类包含一个主键,您可以使用Realm()让Realm智能地更新或添加基于主键值的对象。添加(uu:update:)。”是的,但是属性
messages
已更新为
[message2]
我想我明白了。非常感谢。但是这个问题有什么优雅的解决方案吗?不在3中获取、追加和写入steps@Andreas这一点很重要。当您将message2附加到消息列表时,消息列表为空,因此在附加后,它仅包含message2,并且当您更新用户时,[message2]将替换以前的消息列表,即[message1.]此列表。当您期望新用户与旧用户相等时,新用户不会与任何领域相关联。因此它们还不相等。我使用primaryKey来避免这种情况,docs说:“如果您的模型类包含一个主键,您可以使用Realm()让Realm智能地更新或添加基于主键值的对象。添加(uu:update:)。”是的,但是属性
messages
已更新为
[message2]
我想我明白了。非常感谢。但是这个问题有什么优雅的解决方案吗?不在3中获取、追加和写入steps@Andreas这一点很重要。当您将message2附加到消息列表时,消息列表为空,因此在附加后,它仅包含message2,并且当您更新用户时,[message2]将替换以前的消息列表,即[message1]