Swift - Return 发送 POST 请求时来自 NSURLSession 的数据
Swift - Return data from NSURLSession when sending POST request
我可以使用以下代码在 Swift 中发送 POST 请求
func post() -> String{
let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
request.HTTPMethod = "POST"
let postString = "data=xxxxxxx"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
println("response = \(response)")
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("responseString = \(responseString!)")
}
task.resume()
return "";//how would i return data here
}
我需要 return 结果,但这是不可能的,因为网络请求是异步的。我想我可以使用侦听器等待结果然后 return 它,但我不确定这将如何工作或如何实现它
如果有人可以提供帮助,我将不胜感激
我是 iOS 和 Swift
的新手
您可以使用委托或传递一个函数作为您在最后调用的 post 的参数
带有完成处理程序的示例:
struct RemoteCenter {
static func post(completion: (message: String?) -> Void) {
let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
request.HTTPMethod = "POST"
let postString = "data=xxxxxxx"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
completion(message: NSString(data: data, encoding: NSUTF8StringEncoding) as? String)
}
task.resume()
}
}
class YourController: UIViewController {
override func viewDidLoad() {
RemoteCenter.post(completionHandler)
}
func completionHandler(message: String?){
println("I got \(message)")
}
}
委托示例:
protocol DelegateProtocol {
func didReceiveAMessage(message: String?)
}
struct RemoteCenter {
var delegate:DelegateProtocol?
func post() {
let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
request.HTTPMethod = "POST"
let postString = "data=xxxxxxx"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
self.delegate?.didReceiveAMessage(NSString(data: data, encoding: NSUTF8StringEncoding) as? String)
}
task.resume()
}
}
class YourController: UIViewController, DelegateProtocol {
var remote = RemoteCenter()
override func viewDidLoad() {
remote.delegate = self
remote.post()
}
func didReceiveAMessage(message: String?) {
println("I got \(message)")
}
}
在这两种情况下,目标都是从 Internet 上的 UIViewController 获取一些数据并在完成时打印消息。
你可以找到很多关于它的教程。检查 http://www.raywenderlich.com
您的 post 函数可能类似于:
func post(completionHandler: (response: String) -> ()) { your code }
并在响应部分:
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
completionHandler(response: responseString)
最后,您可以像这样调用 post 方法:
post( {(response: String) -> () in
println("response = \(response)")})
我可以使用以下代码在 Swift 中发送 POST 请求
func post() -> String{
let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
request.HTTPMethod = "POST"
let postString = "data=xxxxxxx"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
println("response = \(response)")
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("responseString = \(responseString!)")
}
task.resume()
return "";//how would i return data here
}
我需要 return 结果,但这是不可能的,因为网络请求是异步的。我想我可以使用侦听器等待结果然后 return 它,但我不确定这将如何工作或如何实现它 如果有人可以提供帮助,我将不胜感激 我是 iOS 和 Swift
的新手您可以使用委托或传递一个函数作为您在最后调用的 post 的参数
带有完成处理程序的示例:
struct RemoteCenter {
static func post(completion: (message: String?) -> Void) {
let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
request.HTTPMethod = "POST"
let postString = "data=xxxxxxx"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
completion(message: NSString(data: data, encoding: NSUTF8StringEncoding) as? String)
}
task.resume()
}
}
class YourController: UIViewController {
override func viewDidLoad() {
RemoteCenter.post(completionHandler)
}
func completionHandler(message: String?){
println("I got \(message)")
}
}
委托示例:
protocol DelegateProtocol {
func didReceiveAMessage(message: String?)
}
struct RemoteCenter {
var delegate:DelegateProtocol?
func post() {
let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
request.HTTPMethod = "POST"
let postString = "data=xxxxxxx"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
self.delegate?.didReceiveAMessage(NSString(data: data, encoding: NSUTF8StringEncoding) as? String)
}
task.resume()
}
}
class YourController: UIViewController, DelegateProtocol {
var remote = RemoteCenter()
override func viewDidLoad() {
remote.delegate = self
remote.post()
}
func didReceiveAMessage(message: String?) {
println("I got \(message)")
}
}
在这两种情况下,目标都是从 Internet 上的 UIViewController 获取一些数据并在完成时打印消息。
你可以找到很多关于它的教程。检查 http://www.raywenderlich.com
您的 post 函数可能类似于:
func post(completionHandler: (response: String) -> ()) { your code }
并在响应部分:
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
completionHandler(response: responseString)
最后,您可以像这样调用 post 方法:
post( {(response: String) -> () in
println("response = \(response)")})