在swift

时间:2015-08-13 11:48:46

标签: swift http request

我试图解决http请求问题,因为我几乎无法理解有关同步和异步方法的所有信息。 我只想知道如何使编译器等待启动http-request完成并且只能继续执行?

例如,我需要获取一些页面,解析数据并将其发布到另一个页面。但是当发布从第一个请求解析的数据的请求首先执行并且然后请求解析正在执行的数据的请求时 - 我是一个大的butthurt。

1 个答案:

答案 0 :(得分:1)

您应该避免将同步网络请求视为瘟疫。它有两个主要问题:

  • 如果没有从不同的线程调用,请求会阻止您的UI,这对于高质量的应用程序来说是很大的禁忌(对于任何应用程序来说都是如此)
  • 除了自身错误
  • 之外,无法取消该请求

我建议您使用一些编写良好的库来处理网络请求,例如AlamofireAFNetworking。对于Swift以及您要完成的任务,我建议使用Alamofire,因为它更易于使用,并且涵盖了您需要的所有基本内容。

您可以执行以下基本请求:

// Perform GET request
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["key": "value"])
         .response { request, response, data, error in

              // Do something with response or error
              println(response)
              println(error)
          }

现在,关于你的问题,你可以随时阻止UI直到网络操作完成,无论是推迟performSegue,还是简单地禁止“下一步”按钮直到你得到响应,或者只是通过覆盖视图与进度条/微调器,例如使用SVProgressHUD library。综合起来,你可以这样做:

// Show progress HUD. This disables user interaction by default
SVProgressHUD.show()

// Perform GET request
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["key": "value"])
         .response { request, response, data, error in

              // Do something with response or error
              println(response)
              println(error)

              // Hide progress to enable user interaction again
              SVProgressHUD.dismiss()

              // Or optionally perform transition to different controller here
              self.performSegueWithIdentifier(identifier, sender: nil)
          }

希望它有所帮助!