gpt4 book ai didi

core-data - 如何在 CoreData+CloudKit 应用程序中正确修剪历史记录?

转载 作者:行者123 更新时间:2023-12-04 11:44:29 25 4
gpt4 key购买 nike

我的应用程序使用 CoreData 和 iCloud 作为后端。多个设备可以访问 iCloud 数据库,因此 .public .
本地 CoreData 存储使用 NSPersistentCloudKitContainer 与 iCloud 同步。 .
我根据 Apple’s suggestions 使用历史跟踪.
在那里,Apple 建议在可能的情况下修剪历史记录。他们说

Because persistent history tracking transactions take up space ondisk, determine a clean-up strategy to remove them when they are nolonger needed. Before pruning history, a single gatekeeper shouldensure that your app and its clients have consumed the history theyneed.


最初这也在 WWDC 2017 talk 中提出。 26:10 开始。
我的问题是:我如何实现这个单一的看门人?
我认为这个想法是单个实例知道应用程序的每个用户最后一次同步他们的设备的时间。如果是这样,则可以修剪该日期之前的交易历史记录。
但是,如果用户同步了本地数据,然后很长时间不再使用该应用程序怎么办?在这种情况下,在该用户再次同步本地数据之前,无法修剪历史记录。所以历史数据可以任意增长。在我看来,这是一个我不知道如何解决的核心问题。
上面引用的 Apple 文档建议:

Similar to fetching history, you can use deleteHistory(before:) todelete history older than a token, a transaction, or a date. Forexample, you can delete all transactions older than seven days.


但这并不能解决我心中的问题。
除了这个一般问题,我的想法是在公共(public) iCloud 数据库中有一个 iCloud 记录类型,它直接为每个设备存储(即没有 CoreData)本地数据库更新的最后日期。由于所有设备都可以读取这些记录,因此很容易确定所有本地数据库更新的最后时间,我可以在此日期之前修剪历史记录。
这是处理问题的正确方法吗?

最佳答案

到现在为止,我认为我的问题部分是基于误解:
在 CoreData 中,持久存储由一个或多个持久存储协调器处理。
如果只有一个,协调员对商店有完全的控制权,不需要历史跟踪。
如果有多个协调器,一个协调器可以更改存储,而另一个则不知道这些更改。
因此,商店的持久历史跟踪记录了商店中的所有交易。
然后,商店可以通过发送 NSPersistentStoreRemoteChange 通知商店的其他用户。通知。
收到此通知后,可以获取和处理交易历史记录。
处理事务后,处理它的用户不再需要它。
在 CoreData + CloudKit 的情况下,一个持久化存储被镜像到 iCloud。
这意味着在最简单的情况下,有一个应用程序的持久存储协调器,并且 - 应用程序不可见 - 一个执行镜像的持久存储协调器。
由于两个协调员可以独立更改商店,因此需要历史跟踪。
如果应用程序更改商店,我假设苹果的镜像软件收到NSPersistentStoreRemoteChange通知、处理交易并将它们转发到 iCloud。通常,即如果有 iCloud 连接,这只需几秒钟,因此交易历史只需要很短的时间。
如果 iCloud 更改被镜像到商店,应用程序会收到 NSPersistentStoreRemoteChange通知,并且必须处理交易。
处理后,应用程序和镜像软件都不再需要它们,可以修剪它们。
这意味着如果应用程序的设备上只有一个持久存储用户,那么在处理通知后的短时间内确实可以完成修剪。
如果设备离线,例如在飞行模式或关闭,它不会收到NSPersistentStoreRemoteChange通知,并且不会修剪交易历史记录。
因此,在处理后 7 天后修剪持久历史确实是安全的。
如果在一台设备上有多个商店用户,情况就不同了,例如一个额外的应用程序扩展。在这种情况下,必须确保在修剪历史记录之前,除应用程序之外的其他目标也处理了交易。这确实可以由单个看门人完成。如何做到这一点是例如在 this post 中描述.

关于core-data - 如何在 CoreData+CloudKit 应用程序中正确修剪历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64124940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com