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)")})