【问题标题】:Swift - Return data from NSURLSession when sending POST requestSwift - 发送 POST 请求时从 NSURLSession 返回数据
【发布时间】:2015-06-23 15:50:07
【问题描述】:

我可以使用以下代码在 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
}

我需要返回结果,但这是不可能的,因为网络请求是异步的。我想我可以使用监听器等待结果然后返回它,但我不确定这将如何工作或如何实现它 如果有人可以提供帮助,我将不胜感激 我是 iOS 和 Swift 的新手

【问题讨论】:

    标签: ios xcode swift post nsurlconnection


    【解决方案1】:

    你的帖子功能可能是这样的:

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

    【讨论】:

    • 谢谢。我刚刚从其他地方得到了同样的解决方案,但还是谢谢你。我会接受你的回答,因为它是我使用的解决方案。作为参考,这是我得到它的地方thatthinginswift.com/completion-handlers
    【解决方案2】:

    您可以使用委托或将函数作为您在最后调用的 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)")
        }
    }
    

    在这两种情况下,目标都是从互联网上的 UIViewController 获取一些数据,并在完成后打印消息。

    你可以找到很多关于它的教程。检查http://www.raywenderlich.com

    【讨论】:

    • 你能举个例子吗?就像我说的,我是新手
    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2020-09-02
    • 2011-10-11
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多