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

标签 ios json swift web-services task

我正在使用 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”函数之后运行以下函数时,任务中的“print”语句是在“print”语句之后执行的“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”会抛出一个错误:

Failed to load: The data couldn’t be read because it isn’t in the correct format.

但是,如果我将“parseJSON”的内容添加到“getJSONFromDatabase”函数的Task中,就没有这个错误了,但是数组还是空的

最佳答案

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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33344069/

相关文章:

javascript - 如何使用 jwplayer 让亚马逊托管的 rtmp 流在 iOS 上工作

ios - 为键为值的 JSON 创建模型

ios - 从 CoreData 中解包 Date() 类型的选项?

ios - 如何将选项集作为滚动位置的参数传递?

ios - 使容器 View 的 viewController 大于容器 View 的大小。可能的?

ios - 有什么方法可以获取在构建时使用的xcode版本?

ios - 无法在 CocoaPods 中找到规范

javascript - ASP.NET MVC JsonResult 返回 500

javascript - NodeJS如何在net模块中实现请求/响应

html - 使用 HTML 和 JavaScript,我如何制作一个在 IOS 设备上显示为 UIPickerview 的选择器?