在 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
,然后添加一个从Leaderboard
到Score
的Core Data 多对多关系。那么每个Score
将是一个NSManagedObject
,它是NSObject
的一个子类。
如果您可以先将其转换为实例Data
,也可以将任何内容放入Core Data。如果您使用了JSONEncoder
,您可以将您的分数数组转换为Data
并使用Data
属性。您必须在每次更新分数时编写代码进行编码,并在每次读取分数时进行解码。如果您决定这样做,请记住虽然JSONEncoder
使用Codable
,但Codable
对Core Data 没有用(它可以使用NSCoding
,但那不是一回事)。
【讨论】:
转换为数据会给出安全编码警告消息,它必须转换为字符串或类似的东西。 这与我的经验不符。我所描述的内容根本不涉及NSCoding
,因此不会出现它打印的有关安全编码的消息。
也许我们在谈论不同的策略。我指的是我在上面链接的问题上使用的风格。使用数据的安全编码消息越来越多地使用可转换的。确切的错误信息在 cmets 中。
我特别避免了可转换的属性——无论如何JSONEncoder
不会使用。以上是关于在 CoreData 中存储排行榜分数?的主要内容,如果未能解决你的问题,请参考以下文章