【问题标题】:Proper way of making an Asynchronous request in Swift 2.0在 Swift 2.0 中发出异步请求的正确方法
【发布时间】:2015-09-21 20:13:57
【问题描述】:

我学习 swift 的速度很慢,主要是通过谷歌搜索遇到的问题。

通过网上研究,我发现了一个规则:

**

从不发出同步请求,始终发出异步请求

**

但是,人们在网上提出请求的方式有很多种,因此很难确定哪一种是正确的。随着 Apple 最近发布 Swift 2,其中一些方法已被弃用。这意味着网络上的大多数示例或答案也已被弃用。

目前我正在使用以下代码发出请求。我不知道这是否是发出请求的正确方式,或者这是否是异步的。

  let request = NSMutableURLRequest(URL: NSURL(string: "www.domain.com")!)
  let session = NSURLSession.sharedSession()

    request.HTTPMethod = "GET"
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    let _: NSError?

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, err -> Void in

    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    print("Response: \(response)")
    let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
    print("Body: \(strData)")
    do {
             self.json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSArray
        } catch {

      }

    })

    task.resume()

我对这篇文章的问题如下:

  1. 为什么异步请求更好?
  2. 在 Swift 2 中发出异步请求涉及哪些步骤?

如果您能提供一些非常有用的示例代码。

P.s (我在网上搜索了几个小时后在这里发帖,并且我已经阅读了很多关于堆栈溢出的帖子,所以我谦虚地请求请不要发布指向其他堆栈溢出帖子的链接作为答案,将它们发布为 cmets

谢谢。

【问题讨论】:

    标签: ios swift asynchronous httprequest swift2


    【解决方案1】:

    为什么异步请求更好?

    当(可能非常耗时)请求和回复通过网络进行时,不会阻塞接口。阻止界面是不好的,而且如果它这样做太久,系统会在用户眼前杀死你的应用程序。

    在 Swift 2 中发出异步请求涉及哪些步骤?

    使用 NSURLSession。您的代码中的此调用是异步的,因为您使用的是 NSURLSession:

    let task = session.dataTaskWithRequest(request, completionHandler:{
        data, response, err -> Void in
        // this code runs asynchronously...
        // ... i.e. later, after the request has completed (or failed)
    })
    

    【讨论】: