我正在使用以下代码将歌曲添加到播放列表对象中的列表中:
func addSongsForPlaylist(songs: [Song], list: Playlist) {
try! realm!.write {
for song in songs {
list.RLMsongs.append(song)
}
}
}
songs
只是我要添加的歌曲数组。 songs
中的歌曲是非持久对象(尚未在境界中),但{1}已在Realm中保留。
我在stackoverflow上发现了很多问题,似乎问了同样的问题,但是他们所有的解决方案都与将追加包装在写入事务中有关,我已经在做了,你可以看到。
我也尝试了以下内容:
list
正在发生的事情是,如果我在控制台中输入try! realm!.write {
list.RLMsongs.appendContentsOf(songs)
}
,新歌就在那里,看起来很棒,但如果我输入po list.RLMsongs
,其po list
属性就会丢失新歌。两者都是如此?它似乎与自己相矛盾,似乎有一些我对RealmSwift缺少的基本信息。
看起来它正在更新内存中的列表但实际上没有提交到Realm。因此,我想可能写入块没有正确提交并将其包装在RLMsongs
中,但是catch永远不会运行,因此写入事务应该成功提交。
编辑:
另外,我注意到我能够删除写入事务并且它不会给我一个错误。我想这可能是这里发生了什么的线索。是否有可能将List视为非持久化,因此即使列表(歌曲)的内容是持久对象,也根本无法在域中正确更新?
答案 0 :(得分:0)
那是因为po list
显示了Realm对象的实例变量的内容,而不是Realm的内容。 Realm不会将数据库的所有内容复制到对象实例的实例变量中,因为这样会非常浪费。
Realm提供了一个LLDB插件(rlm_lldb.py
),它教导调试器显示实际支持Realm的内容而不是未使用的实例变量。但是,由于LLDB Python API对Swift语言支持的限制,它仅适用于Objective-C堆栈帧。
答案 1 :(得分:0)
事实证明我的问题是我必须从领域重新获取播放列表...不知何故,传递给函数的播放列表并未被视为领域中有效的持久化对象。 (即使我有其他更新功能,其工作方式与更新其他属性的方式相同,而不是将对象附加到歌曲列表中,并且这些更新功能正常工作)
我唯一的猜测是,附加到持久化对象内部列表的某些操作方式有所不同,并且必须在本地范围内显式获取列表,而不是仅作为函数参数传入。但是我可能错了。我只是知道这是我如何让它在我的最终工作。