【发布时间】:2015-10-26 11:00:19
【问题描述】:
我正在使用 NSURLSession 调用我自己的返回 JSON 的 Web 服务,使用此代码可以正常工作:
func getJSONFromDatabase(){
let url = NSURL(string: "http://www.myurl/mysqlapi.php")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
self.json = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(self.json)
}
task.resume()
}
但是,这个任务似乎没有按正确的顺序执行,因为当我在“getJSONFromDatabase”函数之后运行以下函数时,任务中的“打印”语句是在“打印”语句之后执行的“parseJSON”函数。
func parseJSON(){
let data = self.json.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSArray
for event in json {
let name = event["name"]
let startDate = event["startDate"]
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date = dateFormatter.dateFromString(startDate as! String)
if date != nil {
self.events.append(Event(name: name as! String, startDate: date!))
}
else {
print("Date is nil")
}
}
for event in self.events {
print(event.name)
}
} catch let error as NSError {
print("Failed to load: \(error.localizedDescription)")
}
}
我的目标是将 JSON 数据保存在“事件”的对象数组中,但这似乎不起作用,因为当我遍历“self.events”数组时,它是空的。
另一个问题是:当我像我在这里发布的那样拆分这 2 件事(2 个函数)时,“parseJSON”会引发错误:
加载失败:由于格式不正确,无法读取数据。
但是,如果我将“parseJSON”的内容添加到“getJSONFromDatabase”函数的Task中,则没有这样的错误,但数组仍然是空的
【问题讨论】:
-
要修复两件事:1-
NSURLSession.sharedSession().dataTaskWithURL是异步的,因此它将在后台执行,而您的应用程序现在正在调用parseJSON()。你必须使用“completionHandler”(SO上有很多例子)。 2-NSURLSession.sharedSession().dataTaskWithURL为您提供 data 但您将其转换为字符串,然后在parseJSON()中将其转换回数据!不是很有效也没有必要。只需使用数据。 -
NSURLSession 的简单示例:stackoverflow.com/questions/31805045/… 以及 completionHandler:stackoverflow.com/questions/26569724/…
-
在 print(self.json) 之后在块中调用 parseJSON
标签: ios json swift web-services task