iOS - 要在领域中列出的追加元素不会保留元素

时间:2016-08-05 15:43:41

标签: ios swift realm

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

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视为非持久化,因此即使列表(歌曲)的内容是持久对象,也根本无法在域中正确更新?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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