gpt4 book ai didi

ios - 如何快速记录日期,时间和分数

转载 作者:行者123 更新时间:2023-11-30 13:43:40 25 4
gpt4 key购买 nike

我正在创建一个简单的测验应用程序。我打算展示某种“历史”,用户可以在其中看到以下内容:


比赛日期和时间
为该特定时段评分


我怎么做?

截至比赛的日期和时间,我在SO上看到此线程:How to get the current time as datetime
但是,如何“记录”用户玩游戏的日期和时间?

关于分数数据,我正在使用:

NSUserDefaults.standardUserDefaults().setInteger(currentScore, forKey: "score")


但是,我只能获得当前分数。如何记录用户在不同日期和时间的每次会话获得的分数?

请注意,获取用户的当前分数没有问题。我需要在多个会话中存储或记录用户分数的帮助。

例如,我想显示以下内容:

Date: 2/7/16
Time: 7:00 AM
Score: 70/100

最佳答案

NSUserDefaults可能与您要执行的操作不正确。我建议使用NSCoding进行简单的数据存储。核心数据可能太简单了。但是,如果您计划保存具有关系的大型数据模型,那么核心数据就是您的最佳选择。

NS编码

NSCoding有两个部分:


编码和解码
存档和取消存档


NSHipster完美地解释了这一点:


  NSCoding是一个简单的协议,有两种方法:-initWithCoder:和encodeWithCoder:。可以将符合NSCoding的类序列化和反序列化为可存档到磁盘或跨网络分布的数据。


存档由NSKeyedArchiverNSKeyedUnarchiver执行。

届会

即使没有NSCoding,也建议使用对象表示数据。在这种情况下,我们可以使用非常有创意的名称Session来表示历史记录中的会话。

class Session: NSObject, NSCoding {

let date: NSDate // stores both date and time
let score: Int

init(date: NSDate, score: Int) { // initialize a NEW session

self.date = date
self.score = score

super.init()

}

required init?(coder aDecoder: NSCoder) { // decodes an EXISTING session

if let decodedDate = aDecoder.decodeObjectForKey("date") as? NSDate {
self.date = decodedDate
} else {
self.date = NSDate() // placeholder // this case shouldn't happen, but clearing compiler errors
}

self.score = aDecoder.decodeIntegerForKey("score")

}

func encodeWithCoder(aCoder: NSCoder) {

aCoder.encodeObject(date, forKey: "date")
aCoder.encodeInteger(score, forKey: "score")

}

}


上面的英文代码按从上到下的顺序排列:


定义类,符合 NSCoding
会话的属性:日期(+时间)和分数
新会话的初始化程序-只需获取日期和分数并为其创建会话
现有会话所需的初始化程序-解码保存的日期和分数


decodeObjectForKey:只是按照说的做(使用键对对象进行解码),然后返回 AnyObject?
但是, decodeIntegerForKey:返回 Int。如果文件中不存在,则返回0,这就是为什么它不是可选的。除 decodeObjectForKey:以外的大多数解码方法都是这种情况

编码现有会话所需的方法-编码日期和分数


编码方法与解码方法一样简单。



这将照顾 Session类,并为 NSCoding准备好属性。当然,您总是可以添加更多的属性和方法。

会话历史

虽然会话本身很好,但是需要一个用于管理会话数组的对象,并且还需要符合 NSCoding。您也可以将此代码添加到现有类中。

class SessionHistory: NSObject, NSCoding {

var sessions = [Session]()

required init?(coder aDecoder: NSCoder) {

if let decodedSessions = aDecoder.decodeObjectForKey("sessions") as? [Session] {
self.sessions = decodedSessions
} else {
self.sessions = [] // another compiler error clearer
}

}

func encodeWithCoder(aCoder: NSCoder) {

aCoder.encodeObject(sessions, forKey: "sessions")

}

override init() { // Used for convenience
super.init()
}

}


英文翻译:


定义经理,符合 NSCoding
为会话数组添加属性
接下来的两个 NSCoding方法几乎与 Session做同样的事情。除了这次,它与数组有关。
新经理的初始化器,将在下面使用。


NSCoding查看此管理器类,并发现它需要对一系列会话进行编码,因此 NSCoding查看 Session类以查看对这些会话进行编码的内容。

NSKeyedArchiver / NSKeyedUnarchiver和Singletons

现在已设置所有 NSCoding,最后一步是合并 NSKeyedArchiverNSKeyedUnarchiver以实际保存和加载数据。

两个重要的方法是 NSKeyedArchiver.archiveRootObject(_, toFile:)NSKeyedUnarchiver.unarchiveRootObjectWithFile:

请注意,这两种方法都需要一个文件。它会自动为您创建文件,但是您需要设置位置。将此添加到 SessionHistory

static var dataPath: String {

let URLs = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
let URL = URLs[0]
return URL.URLByAppendingPathComponent("savehistory").path! // Put anything you want for that string

}


那只是找到文件的位置。您当然可以在其他地方找到该文件。

准备好数据路径后,您可以使用我前面提到的两种方法。我喜欢对经理类使用单例的修改版本,以确保使用相同的对象数组。在 SessionHistory类中:

private static var history: SessionHistory!

static func appHistory() -> SessionHistory {

if history == nil {
if let data = NSKeyedUnarchiver.unarchiveObjectWithFile(dataPath) as? SessionHistory {
history = data
} else {
history = SessionHistory()
}
}

return history

}


这将创建一个私有静态属性来存储应用程序的一个会话历史记录。静态方法检查会话历史记录是否为 nil。如果是这样,它将返回文件上的当前历史记录,并将文件加载到history属性中。否则,它将创建一个新的空会话历史记录。之后,或者,如果history属性已经存储了某些内容,它将返回history属性。

用法

NSCodingNSKeyedArchiver的所有设置均已完成。但是,您如何使用此代码?

每次您想要访问会话历史记录时,请致电

SessionHistory.appHistory()


您想保存会话历史记录的任何地方,请致电

NSKeyedArchiver.archiveRootObject(SessionHistory.appHistory(), toFile: SessionHistory.dataPath)


示例用法如下所示:

let session = Session(date: someRandomDate, score: someRandomScore)
SessionHistory.appHistory().sessions.append(session)
NSKeyedArchiver.archiveRootObject(SessionHistory.appHistory(), toFile: SessionHistory.dataPath)


通过 SessionHistory.appHistory()访问时,会话历史记录将自动从文件中加载。

您实际上并不需要真正地“链接”这些类,只需将会话附加到会话历史记录的 sessions数组中即可。

进一步阅读


NSHipsterNSCoding的一个很好的简单介绍。
Apple's NSCoding guide,尽管在​​Objective-C中更老,但在 NSCoding中更深入。

关于ios - 如何快速记录日期,时间和分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35245469/

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