在 UserDefaults 中设置对象数组
Set array of objects in UserDefaults
如何在 UserDefaults
中设置并稍后获取 json 个对象数组?
当我尝试如下设置时,我的应用程序崩溃了:
import SwiftyJSON
var finalArray = [JSON]()
UserDefaults.standard.set(finalArray, forKey: "attemptedArray")
我的数据如下:
[{
"marked" : 3,
"attempted" : true,
"correct" : 3,
"subject" : 1,
"status" : true,
"question" : 219,
"answer" : 32931,
"time" : 15,
"score" : 5,
"chapter" : 26
}, {
"marked" : 4,
"attempted" : true,
"correct" : 4,
"subject" : 1,
"status" : true,
"question" : 550,
"answer" : 34256,
"time" : 23,
"score" : 10,
"chapter" : 26
}, {
"marked" : 1,
"attempted" : true,
"correct" : 1,
"subject" : 1,
"status" : true,
"question" : 566,
"answer" : 34317,
"time" : 33,
"score" : 14,
"chapter" : 26
}]
do{
try let data = NSKeyedArchiver.archivedData(withRootObject: finalArray, requiringSecureCoding: false)
UserDefaults.standard.set(data, forKey: "attemptedArray")
}catch{
print("Print exception here")
}
UserDefaults
无法保存 SwiftyJSON 的 JSON
类型。你必须保存他们支持的一些类型,在这种情况下,你正在寻找 Data
。
无论如何,将 Data
保存到 UserDefaults
并不是最好的选择,您应该将 Data
保存到其他地方。为此,您可以使用 FileManager
.
因此,为您的数据创建自定义模型而不是使用 JSON
并将 Codable
应用于您的自定义模型
struct Model: Codable {
var marked, correct, subject, question, answer, time, score, chapter: Int
var attempted, status: Bool
}
然后你应该使用这个 Model
作为数组中的元素类型(注意然后你需要使用 JSONDecoder
解码来自 Data
的响应(见下文) )
var finalArray = [Model]()
然后您可以使用 JSONEncoder
将您的模型数组编码为 Data
,您可以将其写入某个文件
do {
let encoded = try JSONEncoder().encode(finalArray)
let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
try encoded.write(to: fileURL)
} catch { print(error) }
和JSONDecoder
用于从保存的文件
解码Data
do {
let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
if let data = try? Data(contentsOf: fileURL) {
let decoded = try JSONDecoder().decode([Model].self, from: data)
}
} catch { print(error) }
出于某些原因,不建议在 NSuser 默认值中保存大量数据:
如果要删除数组的某些单元格,则需要将它们从 nsuser 默认值中删除。只有将它们保存为
阵列而不是个人。
如果您选择每次删除或添加一项时都将它们保存为数组,您将需要保存所有项。如果数组很大
可能会占用一些时间
任何人都可以访问 NSuser 默认值。所以不安全
无论如何我真的推荐使用核心数据。它为您省去了我提到的所有麻烦。
如何在 UserDefaults
中设置并稍后获取 json 个对象数组?
当我尝试如下设置时,我的应用程序崩溃了:
import SwiftyJSON
var finalArray = [JSON]()
UserDefaults.standard.set(finalArray, forKey: "attemptedArray")
我的数据如下:
[{
"marked" : 3,
"attempted" : true,
"correct" : 3,
"subject" : 1,
"status" : true,
"question" : 219,
"answer" : 32931,
"time" : 15,
"score" : 5,
"chapter" : 26
}, {
"marked" : 4,
"attempted" : true,
"correct" : 4,
"subject" : 1,
"status" : true,
"question" : 550,
"answer" : 34256,
"time" : 23,
"score" : 10,
"chapter" : 26
}, {
"marked" : 1,
"attempted" : true,
"correct" : 1,
"subject" : 1,
"status" : true,
"question" : 566,
"answer" : 34317,
"time" : 33,
"score" : 14,
"chapter" : 26
}]
do{
try let data = NSKeyedArchiver.archivedData(withRootObject: finalArray, requiringSecureCoding: false)
UserDefaults.standard.set(data, forKey: "attemptedArray")
}catch{
print("Print exception here")
}
UserDefaults
无法保存 SwiftyJSON 的 JSON
类型。你必须保存他们支持的一些类型,在这种情况下,你正在寻找 Data
。
无论如何,将 Data
保存到 UserDefaults
并不是最好的选择,您应该将 Data
保存到其他地方。为此,您可以使用 FileManager
.
因此,为您的数据创建自定义模型而不是使用 JSON
并将 Codable
应用于您的自定义模型
struct Model: Codable {
var marked, correct, subject, question, answer, time, score, chapter: Int
var attempted, status: Bool
}
然后你应该使用这个 Model
作为数组中的元素类型(注意然后你需要使用 JSONDecoder
解码来自 Data
的响应(见下文) )
var finalArray = [Model]()
然后您可以使用 JSONEncoder
将您的模型数组编码为 Data
,您可以将其写入某个文件
do {
let encoded = try JSONEncoder().encode(finalArray)
let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
try encoded.write(to: fileURL)
} catch { print(error) }
和JSONDecoder
用于从保存的文件
Data
do {
let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
if let data = try? Data(contentsOf: fileURL) {
let decoded = try JSONDecoder().decode([Model].self, from: data)
}
} catch { print(error) }
出于某些原因,不建议在 NSuser 默认值中保存大量数据:
如果要删除数组的某些单元格,则需要将它们从 nsuser 默认值中删除。只有将它们保存为 阵列而不是个人。
如果您选择每次删除或添加一项时都将它们保存为数组,您将需要保存所有项。如果数组很大
可能会占用一些时间
任何人都可以访问 NSuser 默认值。所以不安全
无论如何我真的推荐使用核心数据。它为您省去了我提到的所有麻烦。