【发布时间】:2015-12-14 12:26:42
【问题描述】:
在我的 mainviewcontroller 的 viewDidLoad() 方法中,我触发了几个进程。
let api = JsonData() // create instance of JsonData class
api.loadJson(nil) // this method receives json and writes it in the file.
//Function to find file location
func getFileURL(fileName: String) -> NSURL {
let manager = NSFileManager.defaultManager()
let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: nil)
return dirURL!.URLByAppendingPathComponent(fileName)
}
//file with this name was created in loadJson method
let filePath = getFileURL("JSONFromServer.txt").path!
//trying to read this file
let newDictionary = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Dictionary <String,AnyObject> ]
我期待该文件将在api.loadJson 中创建,然后我就可以阅读它。但是由于某种原因,当我使用调试器时,我发现还没有文件。只有当程序从 viewdidload 方法中退出时,我才能看到该文件已创建。
我想知道程序流程是否具体?
这是我的 JsonData 类:
import Foundation
class JsonData {
var bankDict = [Dictionary <String,AnyObject> ]()
var arrayOfBanks: [[String:AnyObject]] = []
func loadJson(completion: ((AnyObject) -> Void)!) {
var urlString = "http://almaz.com/getjson.php"
let session = NSURLSession.sharedSession()
let sourceUrl = NSURL(string: urlString)
var task = session.dataTaskWithURL(sourceUrl!){
(data, response, error) -> Void in
if error != nil {
println(error.localizedDescription)
} else {
var error: NSError?
var jsonData = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &error) as! NSArray
//println(jsonData)
//convert from JSON into array of dictionaries
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(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
}
//println(self.bankDict)
//Store data in file
//File path and name
if let dirs : [String] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] {
let dir = dirs[0] //documents directory
let filePath = dir.stringByAppendingPathComponent("JSONFromServer.txt");
NSKeyedArchiver.archiveRootObject(self.bankDict, toFile: filePath)
// println(filePath)
}
}
}
task.resume()
}
}
【问题讨论】:
-
很遗憾我不知道你在哪里,否则我会来到你的办公室,越过你的肩膀看看你在说什么。既然我不能,你能告诉我们JsonData来自哪里等等等等,因为你在这里给我们的信息坦率地说完全没有用。
-
JSON 数据的下载很可能是异步完成的,因此您无法在调用
loadJson后立即尝试读取文件。 -
具有相似命名方案的 Json 库太多了,无法猜测您使用的是哪一个。
-
各位对不起。检查更新的问题。希望现在有意义
-
不。您需要告诉我们您正在使用哪个 JSON 库,并提供指向该库信息的链接。正如其他人所建议的那样,您的 JSON 库的 loadJson 调用很可能是异步运行的,但如果没有更多信息,我们无法判断。