iOS - 将元素附加到领域中的列表不会保留元素

Posted

技术标签:

【中文标题】iOS - 将元素附加到领域中的列表不会保留元素【英文标题】:iOS - Appending element to list in realm does not persist element 【发布时间】:2016-08-05 15:43:41 【问题描述】:

我正在使用以下代码将歌曲添加到我的播放列表对象的列表中:

func addSongsForPlaylist(songs: [Song], list: Playlist) 
    try! realm!.write 
        for song in songs 
            list.RLMsongs.append(song)
        
    

songs 只是我想要添加的歌曲的数组。 songs 中的歌曲是非持久化对象(尚未在领域中),但 list 已在领域中持久化。

我在 *** 上发现了很多问题,这些问题似乎都在问同样的问题,但他们的所有解决方案都与将追加包装在写入事务中有关,正如您所看到的那样,我已经在执行此操作。

我还尝试了以下方法:

try! realm!.write 
    list.RLMsongs.appendContentsOf(songs)

发生的情况是,如果我在控制台中输入 po list.RLMsongs,新歌就在那里,而且看起来很棒,但如果我输入 po list,它的 RLMsongs 属性会丢失新歌。怎么可能两者都是真的?它似乎自相矛盾,似乎我在 RealmSwift 中缺少一些基本的东西。

看起来它正在更新内存中的列表,但实际上并未提交给 Realm。因此,我认为写入块可能没有正确提交并将其包装在 do catch 中,但 catch 从未运行,因此写入事务应该成功提交。

编辑:

另外,我注意到我能够删除写事务并且它不会给我一个错误。我认为这可能是这里发生的事情的线索。列表是否可能被认为是非持久化的,因此即使列表的内容(歌曲)是持久化对象,也可能根本无法在领域中正确更新?

【问题讨论】:

【参考方案1】:

那是因为po list 显示的是 Realm 对象的实例变量的内容,而不是 Realm 的内容。 Realm 不会将数据库的所有内容复制到对象实例的实例变量中,因为那样会非常浪费。

Realm 提供了一个 LLDB 插件 (rlm_lldb.py),它教调试器显示 Realm 支持的实际内容,而不是未使用的实例变量。但是,由于 LLDB Python API 对 Swift 语言支持的限制,它仅适用于 Objective-C 堆栈帧。

【讨论】:

这很有意义。谢谢回答。现在为什么它实际上根本没有出现在领域中。我正在使用 Realm 浏览器查看领域中的内容,但它没有将歌曲链接到播放列表,甚至根本没有将歌曲添加到领域。 如果您分享一个示例项目来证明这一点,我很乐意为您提供更多帮助。 我真的无法在另一个项目@jpsim 中复制它,但是我发现了一些关于写入事务的新信息(编辑后的最后一段)。这是否有助于为您阐明问题? list.realm 给你什么?如果它返回nil,那么你正在使用一个非托管列表,如果你希望它被管理,你应该将它添加到领域。【参考方案2】:

原来我的问题是我必须从领域重新获取播放列表...不知何故,当它被传递到函数中时,播放列表不被视为领域中的有效持久对象。 (即使我有其他更新函数的工作方式与更新其他属性的方式相同,而不是将对象附加到歌曲列表,并且这些更新函数工作正常)

我唯一的猜测是,与附加到持久对象内部的列表有关的工作方式有所不同,并且列表必须在本地范围内显式获取,而不仅仅是作为函数参数传入。然而,我可能错了。我只知道这就是我如何让它发挥作用的方式。

【讨论】:

以上是关于iOS - 将元素附加到领域中的列表不会保留元素的主要内容,如果未能解决你的问题,请参考以下文章

我们又来了:将一个元素附加到 R 中的列表中

我们又来了:将一个元素附加到 R 中的列表中

如何将 Vuetify v-menu 附加到可滚动列表中的父元素?

是否可以将元素附加到 JavaScript 节点列表?

将元素附加到子元素会触发父元素中的 drop 事件

为啥我不能从将一个列表附加到另一个列表中获取元素