【发布时间】:2015-12-11 13:36:27
【问题描述】:
我正在构建一个应用程序,它将:
- 检查互联网连接;
- 如果服务器可达,则从服务器接收 JSON 文件并将数据存储在文件中;
- 如果与服务器的连接断开,则从文件中读取。
现在我设法实现了连接检查、接收 JSON、将数据放入数组。
收到的 JSON 如下所示:
然后我使用下面的代码来创建一个字典数组来存储 JSON 数据。选择字典数组以便能够对其进行过滤,然后使用值的键来获取值。
var rates = [ExchangeRates]() //instance of class Rate
var bnkDct = ["bank": "", "currency": "","buyrate": "", "sellrate": ""] //template
var indx : Int = 0 //index for iteration
for rate in jsonData{
let rate = ExchangeRates(data: rate as! NSDictionary)
rates.append(rate)
bnkDct["bank"] = rates[indx].bank
bnkDct["buyrate"] = rates[indx].buyRate
bnkDct["sellrate"] = rates[indx].sellRate
bnkDct["currency"] = rates[indx].currency
self.bankDict.append(bnkDct)
indx += 1
}
在这之后我有一个看起来像这样的数组:
现在我想将此数组保存到一个文件中,并且显然能够读取它。
我试图用这样的东西写数据:
let filePath = NSTemporaryDirectory() + "MyData.dat"
self.bankDict.writeToFile(filePath, automatically: true)
但它给了我一个错误:“[(Dictionary)] 没有 writeToFile 成员”。
我也不能将其转换为 NSDictionary 以使用相同的 writeToFile 方法。
我也试图用这样的东西写数据:
let filePath = NSTemporaryDirectory() + "MyData.dat"
NSKeyedArchiver.archiveRootObject(self.bankDict, toFile: filePath)
它会创建一个编码奇怪的文件:
当我试图阅读它时:
let newDictionary = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Dictionary <String,AnyObject> ]
我收到错误:“致命错误:在展开可选值时意外发现 nil”
调试器也显示了非常“有趣”的东西:
newDictionary 变量有无数个值。数组中有 40 个字典,写入文件。
任何人都可以建议我在这里做错了什么,或者我在这里使用了不好的做法吗?
【问题讨论】:
-
我认为你应该看看 Core Data。这是一个很好的开始链接:raywenderlich.com/85578/first-core-data-app-using-swift
-
去掉类型转换
as! [Dictionary <String,AnyObject> ],看看值是什么。 -
我的猜测是您在应用程序启动之间丢失了保存的文件,因为每次应用程序启动时
NSTemporaryDirectory路径都会更改。解决方案是将其保存到永久位置。至于newDictionary及其无数项,这只是调试器吓坏了,因为如果在变量声明之后但在填充之前停止,它无法找到实际的变量内容。我敢打赌这个变量实际上是空的。 -
@EricD。感谢您的回复,但它似乎很好地找到了文件。我正在使用函数: func getFileURL(fileName: String) -> NSURL { let manager = NSFileManager.defaultManager() let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, properForURL: nil, create: false, error: nil ) return dirURL!.URLByAppendingPathComponent(fileName) } let filePath = getFileURL("MyData.dat").path!我试图比较它们匹配的文件路径。
-
@Adam 当我删除类型转换时它向我显示警告。如果我运行应用程序,它使用 AnyObject?类型和值为零
标签: ios arrays json swift dictionary