在 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)
}
希望对您有所帮助!
我尝试解决 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)
}
希望对您有所帮助!