在 swift 中发送 http 请求

Sending http-request in swift

我尝试解决 http-request 问题,因为我几乎无法理解同步和异步方法的全部内容。 我只想知道如何让编译器等待开始的 http-request 完成然后才继续执行?

例如,我需要获取一些页面,解析数据并post它到另一个。但是,当从第一个请求中解析出 posts 数据的请求首先执行,然后才执行解析数据的请求时 - 我有一个大屁股。

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

  • 如果不是从不同的线程调用,该请求会阻止您的 UI,这对于高质量的应用程序来说是大禁忌(好吧,对于任何应用程序来说都是如此)
  • 除非它自己出错,否则无法取消该请求

我建议您使用一些编写良好的库来处理网络请求,例如 Alamofire or AFNetworking。对于 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,还是简单地禁止 "Next" 按钮直到您得到响应,或者简单地通过使用进度条/微调器覆盖视图,例如使用 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)
          }

希望对您有所帮助!