Swift 2.0: 与JSON REST API通信的最佳实践

4
我开始转向Swift,但发现大多数示例代码在Swift 2.0中不再起作用,并且对于初学者来说很难理解。那么,在Swift 2.0中使用标准库的Swift方法与REST API通信的最佳实践是什么?能否提供以下场景的Swift 2.0代码?
1.从服务中获取JSON数据 2.解析JSON(以便在Swift中使用) 3.使用JSON编码数据发送POST请求
请提供一个没有框架的解决方案。希望这有助于所有试图使网络教程在Swift 2.0上运行的人们。

我建议你尝试诚信地将你找到的Swift 1.2示例之一转换为Swift 2.0。 转换并不是很难。 如果你对Swift 2.0语法有疑问,请参阅WWDC 2015视频What's New in Swift。 关于你的问题,我建议你考虑Alamofire的Swift 2.0分支,它简化了请求的准备和响应的解析。 - Rob
@Rob 根据Stackoverflow上的所有评论,我决定针对Swift 2.0 BP提出具体问题 - 因为JSON解析中的一些函数参数已更改,并且如初学者所说,很难理解。2015 WWDC视频在第二步中并没有真正帮助到我。 - bMalum
1个回答

4

我也是一个初学者,不能说我所做的是最佳实践,但这是我如何使用NSURLSession和闭包处理GET请求的方法。

首先,我定义了一个NetworkOperation类,它将处理NSURLSession。它具有以下属性:

lazy var config: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
lazy var session: NSURLSession = NSURLSession(configuration: self.config)
let queryURL: NSURL

在初始化程序中,我设置了queryURL。config和session vars是lazy,因为我希望它们只在使用我的网络操作时才被初始化。

然后我有一个执行GET请求并检索JSON的方法。该方法接受一个闭包作为参数。这个闭包将由调用者提供,并允许我将我的dataTask响应捕获到调用上下文中。

func downloadJSONFromURl(completion: ([String:AnyObject]?) -> ()) {
    let request = NSURLRequest(URL: queryURL)

    let dataTask = session.dataTaskWithRequest(request) {
        (let data: NSData?, let response: NSURLResponse?, let error: NSError?) -> Void in

        // 1: Check HTTP Response for successful GET request
        guard let httpResponse = response as? NSHTTPURLResponse, receivedData = data
        else {
            print("error: not a valid http response")
            return
        }

        switch (httpResponse.statusCode) {
        case 200:
            // 2: Create JSON object with data
            do {
                let jsonDictionary = try NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments)
                    as? [String:AnyObject]

                // 3: Pass the json back to the completion handler
                completion(jsonDictionary)
            } catch {
                print("error parsing json data")
            }
        default:
            print("GET request got response \(httpResponse.statusCode)")
        }
    }
    dataTask.resume()
}

这个例子非常简单,不处理错误,但你可以看到我如何将JSON解析成一个[String:AnyObject]并放入try catch块中。
之后,我将字典发送回名为completion的闭包中,在那里对JSON进行必要的验证,然后将其转换为Swift对象。
在该闭包中,我使用可选绑定来安全地构建对象。 例如,假设我正在检索一本书,并且JSON如下: {title: "Some book", author:"J. Doe"}
if let title = json["author"] as? String, author = json["author"] as? String {
    let book = Book(title: title, author: author)
    serviceCompletion(book)
}

因为我喜欢闭包,所以我将转换后的JSON发送到另一个提供给服务的闭包中。您可以在我的GitHub上查看完整示例。这是来自Treehouse教程的内容。
希望这能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接