iOS - 在 Swift 中调用 Webservice 并解析 JSON

Posted

技术标签:

【中文标题】iOS - 在 Swift 中调用 Webservice 并解析 JSON【英文标题】:iOS - calling Webservice and parsing JSON in Swift 【发布时间】: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 的简单示例:***.com/questions/31805045/… 以及 completionHandler:***.com/questions/26569724/… 在 print(self.json) 之后在块中调用 parseJSON 【参考方案1】:

dataTaskWithURL 是异步的,因此您的代码不会自上而下执行。使用完成处理程序处理异步调用的结果。

func getJSONFromDatabase(success: ((json: String)->()))
    let url = NSURL(string: "http://www.myurl/mysqlapi.php")

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) (data, response, error) in
        let json = NSString(data: data!, encoding: NSUTF8StringEncoding)
        success(json: json)
    
    task.resume()

使用中

getJSONFromDatabase(success: json in 
    //do stuff with json
)

【讨论】:

以上是关于iOS - 在 Swift 中调用 Webservice 并解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

didSelectItemAtIndexPath 没有在 ios swift 中调用

如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?

CLLocationManager 未在 iOS 10.2 [Swift] 中调用 didUpdateLocation()

如何在 swift iOS 应用程序中调用分支初始化

iOS OC和Swift进行互相调用

Swift iOS SearchController 未在 ViewDidLoad 中调用