保存和加载结构数组的最佳做法是啥?
Posted
技术标签:
【中文标题】保存和加载结构数组的最佳做法是啥?【英文标题】:Whats the best practice to save and load array of struct?保存和加载结构数组的最佳做法是什么? 【发布时间】:2019-06-06 10:06:41 【问题描述】:我正在寻找保存我的结构数组的建议,以便它们在开始时可用并且可以轻松访问和更新。
我看过的所有教程都只有 1 个结构实例,所以我在实现结构数组时一直失败。
数据结构是:
struct Stock : Codable
let ticker : String
let amount : Double
var boughtAt : Double
var totalValue : Double
var realTimePrice : Double
var float : Double
var type : String
var stocksArray = [Stock]()
【问题讨论】:
您应该解释使用案例以及您到目前为止所做的尝试,以便我们更好地回答您的问题 使用核心数据 :) 了解您要存储多少数据非常重要。另外,您一直在关注什么技术(例如,您尝试将数据存储在哪里)? 首先UserDefaults
不鼓励这种用户数据,您可以在文档文件夹、Core Data、Realm、Firebase、mysql 等其他数据库中使用编码数据作为 JSON 或属性列表文件. 或 CloudKit
感谢@J.Doe 的想法 :) 我实际上是通过 CoreData 让它工作的。
【参考方案1】:
由于您的struct Stock
符合Codable
,您可以使用JSONEncoder
轻松地将array [Stock]
存储为UserDefaults
中的data
,即
var stocksArray = [Stock]()
do
let data = try JSONEncoder().encode(stocksArray)
UserDefaults.standard.set(data, forKey: "stocksArray")
catch
print(error)
同样,您可以使用JSONDecoder
之类的方式从UserDefaults
获取,
if let data = UserDefaults.standard.data(forKey: "stocksArray")
do
let arr = try JSONDecoder().decode([Stock].self, from: data)
print(arr)
catch
print(error)
这是存储array
的一种方式。还有其他方法 - CoreData
、File
等。
【讨论】:
这完美!对我来说非常简短易懂。最重要的是,一旦数据被加载,它的结构与我需要的完全相同,谢谢! 二进制property lists
可能是UserDefaults
中更好的存储格式【参考方案2】:
在我看来, 您可以将您的 Struct 转换为 Dictionary 类型并将该字典添加到 NSArray 并将该数组保存到手机的 Document 目录中。
例子,
struct Stock
var ticker : String = ""
var amount : Double = 0.0
var boughtAt : Double = 0.0
var totalValue : Double = 0.0
var realTimePrice : Double = 0.0
var float : Double = 0.0
var type : String = ""
var json:Dictionary<String,Any>
set
self.ticker = newValue["ticker"] as! String
self.amount = newValue["amount"] as! Double
self.boughtAt = newValue["boughtAt"] as! Double
self.totalValue = newValue["totalValue"] as! Double
self.realTimePrice = newValue["realTimePrice"] as! Double
self.float = newValue["float"] as! Double
self.type = newValue["type"] as! String
get
return ["ticker":self.ticker,"amount":self.amount,"boughtAt":self.boughtAt,"totalValue":self.totalValue,"realTimePrice":self.realTimePrice,"float":self.float,"type":self.type]
init(withJSON json:Dictionary<String,Any>)
self.json = json
//Now, get dictionary from object and add it into array.
let stock = Stock(withJSON: [:])
let json = self.stock.json
let array = NSArray(arrayLiteral: json)
//Now, you can save NSArray to file.
array.write(toFile: "file path.plist", atomically: true)
//You can get array from plist file,
let array = NSArray(contentsOfFile: "file path.plist")
【讨论】:
感谢您的这个想法 :) 但是,我会将该数据用于 UITable(我忘了提及),所以我必须在使用它之前重新创建我的结构。以上是关于保存和加载结构数组的最佳做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
java中保存Bigdata Integer记录的最佳数据结构是啥?