【问题标题】:CloudKit, join or efficient way to add an item to listCloudKit,加入或将项目添加到列表的有效方式
【发布时间】:2016-09-29 20:56:18
【问题描述】:

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

该应用可以拥有成千上万的用户和消息。我使用 swift3。

我已经想到了不同的方法,但它们在性能方面似乎很差:

  • 在 Message 中添加一个字段“readers”,该字段是用户 ID 对应的字符串列表。问题是如果我想添加一个新的用户 ID,我必须加载所有列表。如果很多用户都阅读了消息,这对于移动应用程序来说是有问题的。我可以在不下载所有列表的情况下延迟获取列表字段并向其添加值吗(就像在经典 Orm 中一样)?
  • 添加另一个记录类型“读者”,它有两个字段:用户 ID 和消息 ID。我找不到将消息和阅读器加入谓词以仅下载用户尚未阅读的消息的方法。这可能吗?
  • As suggested by Matthew:在私有数据库中添加一条记录类型ReadArticle,只存储一条消息的CKReference。问题是我们需要先下载所有消息 ID,然后再将它们发送到 NOT 谓词中。

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

有什么建议吗?

【问题讨论】:

    标签: swift cloudkit


    【解决方案1】:

    读者字段

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

    阅读器对象

    即使有办法让它发挥作用,您也会将用户 ID 存储在公共数据库中。这可能不是一个注重隐私的事情。

    私有数据库中的ReadMessage记录

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

    然后,当有人读到Message 时,您可以从该Message 中获取recordId,从中创建一个CKReference,并将该引用放在新CKRecord 对象的“消息”字段中ReadMessage 类型。然后,将其保存到用户的私有数据库中。因为它是CKReference,它实际上几乎不会占用 iCloud 中的任何空间,因为它只是一个指针,而且由于您将使用用户的私有数据库,因此无需显式识别用户。

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

    【讨论】:

    • 但是如果我理解的话,移动应用程序需要在执行谓词之前下载完整的未读消息内容并在谓词中重新发送所有这些数据?这对于大量未读消息来说是有问题的,不是吗?或者你有办法在谓词中加入私有和公共数据库(找不到它)?
    • 确实如此。可能有更好的方法,这正是我最初想到的。我不相信你可以在谓词中组合数据库。
    • 我把这个解决方案加到我的帖子里了,但是性能问题还是一样;)
    • 很抱歉听到这个消息。希望有人能找到解决方案。
    猜你喜欢
    • 2019-01-22
    • 2023-04-06
    • 1970-01-01
    • 2013-03-07
    • 2020-09-20
    • 2011-09-20
    • 2013-12-25
    • 2020-06-23
    • 2019-11-29
    相关资源
    最近更新 更多