CloudKit,加入或有效的方式将项目添加到列表

时间:2016-09-29 20:56:19

标签: swift cloudkit

我使用CloudKit管理消息列表(记录类型消息带有字段标题和正文)。所有消息都是公开的,我想维护用户使用移动应用程序读取的消息。

该应用可以拥有数千个用户和消息。我使用swift3。

我想到了不同的做法,但在表现方面看起来很差:

  • 添加字段'读者' to Message是用户ID对应的字符串列表。问题是如果我想添加一个新的用户ID,我必须加载所有列表。在许多用户已阅读该消息的情况下,这对于移动应用程序是有问题的。我可以懒得获取列表字段并为其添加值而无需下载所有列表(如经典Orm中)吗?
  • 添加另一种记录类型' Reader'它有两个字段:用户ID和消息ID。我找不到在谓词中加入Message和Reader的方法,只下载用户无法读取的Message。那可能吗?
  • As suggested by Matthew:在私有数据库中添加记录类型ReadArticle,该数据库仅将CKReference存储到消息中。问题是我们需要在发送NOT谓词之前下载所有消息ID。

我不知道如何使用像CloudKit这样的数据库来解决这个问题。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

读者字段

由于您指出的确切原因,这种方法并不理想,而且它还不安全,因为String理论上可以包含任何内容。

读者对象

即使有办法实现这一点,您也可以将用户ID存储在公共数据库中。这可能不是一个隐私意识的事情。

私有数据库中的ReadMessage记录

假设您有一个名为ReadArticle的记录类型。该对象只包含一个字段,CKReferenceMessage记录。

然后,当有人阅读Message时,您会获取recordId的{​​{1}},从中创建Message,并将该引用放入&#34 ;消息"类型为CKReference的新CKRecord对象的字段。然后,将其保存到用户的私人数据库。因为它是ReadMessage,它实际上几乎不会占用iCloud中的任何空间,因为它只是一个指针,并且因为您使用了用户的#s私人数据库无需明确识别用户。

然后,当您想要所有未读消息时,获取CKReference记录,并创建一个NOT谓词以接收记录ID不是任何读取记录的所有ReadMessage记录。 CloudKit肯定支持NOT谓词,但如果它不支持指定记录ID的NOT谓词,那么你可以在消息上使用其他一些唯一字段。