Ios 在应用程序终止之前,存储(持久化)结构数组的最有效方法是什么?
编程语言-swift 我已经创建了一个结构来存储与我的应用程序相关的所有信息,如下所示。此外,我正在创建wordstruct类型的数组,并用come3000个条目填充它Ios 在应用程序终止之前,存储(持久化)结构数组的最有效方法是什么?,ios,swift,Ios,Swift,编程语言-swift 我已经创建了一个结构来存储与我的应用程序相关的所有信息,如下所示。此外,我正在创建wordstruct类型的数组,并用come3000个条目填充它 struct wordStruct{ var wordd:NSString var meaning: [NSString] var sentance: String var syn: [String] var seen:Int var set: Int var HF: In
struct wordStruct{
var wordd:NSString
var meaning: [NSString]
var sentance: String
var syn: [String]
var seen:Int
var set: Int
var HF: Int
}
在尝试了我能想到的多种方法之后,我无法存储(持久化)数据(即结构数组)。
我也尝试过NSUserDefault、Plist和NSCoding方法(我可能做错了什么)
存储结构数组最有效的方法是什么?
将数组写入文件能起到作用吗?首先将结构包装在“NSData”中通常起到“NSCoding”的作用,因为它被视为一个字节序列
或者立即使用“核心数据”,以便从长远来看,在信息的持久存储方面使您的生活更轻松。结构不能符合NSCoding,因为NSCoding是一种类协议。如果您想使用NSCoding来持久化您的模型(这通常是最简单的方法),您必须将您的模型重新声明为符合NSCoding的NSObject 下面是一个基于您提供的代码段实现它的示例:
class Word: NSObject, NSCoding {
var word: NSString!
var meaning: [NSString]!
var sentence: String!
var syn: [String]!
var seen:Int!
var set: Int!
var HF: Int!
// specify how your model will be decoded:
required convenience init(coder decoder: NSCoder) {
self.init()
self.word = decoder.decodeObjectForKey("word") as! String
self.meaning = decoder.decodeObjectForKey("meaning") as! [String]
self.sentence = decoder.decodeObjectForKey("sentence") as! String
self.syn = decoder.decodeObjectForKey("syn") as! [String]
self.seen = decoder.decodeIntegerForKey("seen")
self.set = decoder.decodeIntegerForKey("set")
self.HF = decoder.decodeIntegerForKey("HF")
}
// specify how your model will be encoded
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(word, forKey: "word")
coder.encodeObject(meaning, forKey: "meaning")
coder.encodeObject(sentence, forKey: "sentence")
coder.encodeObject(syn, forKey: "syn")
coder.encodeInteger(seen, forKey: "seen")
coder.encodeInteger(set, forKey: "set")
coder.encodeInteger(HF, forKey: "HF")
}
}
// an example word:
let example = Word()
example.word = "example"
example.meaning = ["abstractions", "generalizations", "use cases"]
example.sentence = "here is how you can implement NSCoding"
example.syn = ["what", "is", "a", "syn"]
example.seen = 1
example.set = 2
example.HF = 3
// persist the example to NSUserDefaults
let data = NSKeyedArchiver.archivedDataWithRootObject(example)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "example")
// load the saved example from NSUserDefaults
if let data = NSUserDefaults.standardUserDefaults().objectForKey("example") as? NSData {
if let example = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Word {
example.meaning // ["abstractions", "generalizations", "use cases"]
example.set // 2
example.seen // 1
example.word // "example"
}
}
为了进一步阅读,马特·汤普森在这里发表了一篇关于这个主题的精彩文章:
阅读官方文件也不会有什么坏处:
NSCoding
可能是我的猜测。如果你不能让这些方案中的任何一个发挥作用,你可能是做错了什么。(确保检查所有返回代码和错误
参数。它们在那里是有原因的。)所以每当我尝试做这个acorder.encodeObject(word,forKey:“word array”)我收到EXC错误指令不知道为什么?我最近看到一些人从Swift的NSCoding代码中收到错误指令。但我想说的是,NSCoding将是保存数据的一种明智的方式。可能是您遇到了一个测试版bug。发布你的NSCoding解决方案,告诉我们你从哪里得到了错误的指令,也许我们可以找到答案。(顺便说一句,EXC_BAD_指令通常是来自iOS库调用的断言失败;断言故意向处理器抛出一条BAD指令以停止一切。)