在 CoreData 中存储排行榜分数?

Posted

技术标签:

【中文标题】在 CoreData 中存储排行榜分数?【英文标题】:Store Leaderboard Scores in CoreData? 【发布时间】:2022-01-01 07:06:56 【问题描述】:

我正在尝试在我的应用上的 CoreData(具有最终的 CloudKit 功能)中存储排行榜,但对如何最好地做到这一点感到困惑。

用户将能够创建和保存多个排行榜。每个排行榜都会有一个创建日期、名称、ID 以及该排行榜的所有分数。在核心数据模型(如下)中,我将所有这些作为属性添加到排行榜实体中,对于得分属性,我将其保留为未定义。我正在考虑将其设为我的 score 结构的数组。但是,当我尝试这样做时,newLearboard.scores = [Score]() 在我的Persistence.swift 文件中被告知我需要添加分数as NSObject。这是执行此操作的正确方法吗,还是会在我添加/显示分数排行榜时产生意想不到的后果?

Score 是一个结构体,包含一些字段,例如名称和值等。

我最终还可以将 Swift 集合包中的 Score 数组转换为 OrderedSet。这会产生其他问题吗?

【问题讨论】:

不,不是,创建一个新实体Score,然后在Leaderboard和Score之间建立一对多关系 这能回答你的问题吗? how to delete and update structure type array in core data ios swift 您可以很容易地做到这一点,正如您将在我上面标记的帖子中看到的那样,但是如果出现错误,您可能会丢失整个事情。它全部作为字符串保存到一个变量中。创建与排行榜相关的实体是更安全的方法。 【参考方案1】:

Core Data 不知道如何存储 Swift 结构。 Xcode 试图提供帮助,但并没有真正成功。使用 as NSObject 不会做你想要的,因为一个结构不能被类型转换为 NSObject

Core Data 方法是在模型中添加第二个实体Score,然后添加一个从LeaderboardScore 的Core Data 多对多关系。那么每个Score 将是一个NSManagedObject,它是NSObject 的一个子类。

如果您可以先将其转换为实例Data,也可以将任何内容放入Core Data。如果您使用了JSONEncoder,您可以将您的分数数组转换为Data 并使用Data 属性。您必须在每次更新分数时编写代码进行编码,并在每次读取分数时进行解码。如果您决定这样做,请记住虽然JSONEncoder 使用Codable,但Codable 对Core Data 没有用(它可以使用NSCoding,但那不是一回事)。

【讨论】:

转换为数据会给出安全编码警告消息,它必须转换为字符串或类似的东西。 这与我的经验不符。我所描述的内容根本不涉及NSCoding,因此不会出现它打印的有关安全编码的消息。 也许我们在谈论不同的策略。我指的是我在上面链接的问题上使用的风格。使用数据的安全编码消息越来越多地使用可转换的。确切的错误信息在 cmets 中。 我特别避免了可转换的属性——无论如何JSONEncoder 不会使用。

以上是关于在 CoreData 中存储排行榜分数?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌排行榜提交分数错误:必须连接GoogleApiClient

排行榜分数未更新

PHP中游戏的排行榜/高分

向 Google Play 游戏排行榜提交分数并显示新排名

如何从排行榜中删除或更改玩家的分数?

如何限制到最大值。在 Google Play 游戏服务排行榜 API 中提交 1x 分数?