我也是一个初学者,不能说我所做的是最佳实践,但这是我如何使用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
guard let httpResponse = response as? NSHTTPURLResponse, receivedData = data
else {
print("error: not a valid http response")
return
}
switch (httpResponse.statusCode) {
case 200:
do {
let jsonDictionary = try NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments)
as? [String:AnyObject]
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教程的内容。
希望这能对您有所帮助。