我们可以像在 android asyncTask 中一样显示加载状态,直到我们在 swift 中使用 HTTP Post 请求得到响应

Posted

技术标签:

【中文标题】我们可以像在 android asyncTask 中一样显示加载状态,直到我们在 swift 中使用 HTTP Post 请求得到响应【英文标题】:Can we show a loading status like in android asyncTask until we get the response while using an HTTP Post request in swift 【发布时间】:2016-08-17 07:46:09 【问题描述】:

我对快速编程很陌生。我了解到 NSURLSession 使用异步通信从 url 获取响应。在请求完成并且我得到响应之前,我怎么可能显示加载状态。例如,如果我有一个从文本字段提交给 NSurlsession 的值,我必须显示另一个包含来自 httprequest 的响应的文本字段。当我点击提交按钮直到我得到响应时,我应该显示一个加载状态,以便用户知道一些过程正在进行,比如“加载中,请稍候!!”。

还有我们如何使用处理程序来知道我们得到了响应。同样,我不会因此返回 nil 值

这是我现在的功能

类 func postURL(var postString:String,var postLink:String) -> NSDictionary



    let link = postLink

    let request = NSMutableURLRequest(URL: NSURL(string:link)!)

    request.HTTPMethod = "POST"

    let values = postString


    request.HTTPBody = values.dataUsingEncoding(NSUTF8StringEncoding)

    var dictionaryVal:NSDictionary!

    var semaphore = dispatch_semaphore_create(0)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request)
     data, response, error in
        guard error == nil && data != nil else
        
            print("error=\(error)")
            return
        

        if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(response)")
        

        var responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        do
            print(">>>",responseString!)
            var dataExample : NSData = (responseString!.dataUsingEncoding(NSUTF8StringEncoding))!
            dictionaryVal = try NSJSONSerialization.JSONObjectWithData(dataExample, options:.MutableLeaves) as? NSDictionary
        
        catch
        
            responseString = nil
            print("Error")
        
        dispatch_semaphore_signal(semaphore)
    
    task.resume()
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    return dictionaryVal!


【问题讨论】:

我觉得很奇怪,您已经为 NSURLSession 实现了响应处理程序,但不明白如何知道您何时收到响应...当您收到响应时,处理程序执行... 我从网上拿了代码..虽然我不明白逻辑 嗯,在这种情况下,当 web 服务返回响应时,附加到 NSURLSession.sharedSession().dataTaskWithRequest(request) 的大括号内的所有内容都将被执行,因此您可以将文本放在文本字段中并停止加载指标等 实际上没关系,信号量会停止它,但这是不好的做法,因为它可能会导致您的应用程序冻结,直到响应从服务器返回,除非整个方法在后台线程 你能解释一下如何在后台线程中执行整个方法。我根据你的建议尝试过,但找不到正确的方法。 【参考方案1】:

您可以使用UIActivityIndicatorView 来显示进程指示器,如以下函数中使用的那样。您还可以在启动时禁用 UserInteraction 并在响应后启用。

func APICall()

    var sessionConfiguration:NSURLSessionConfiguration!
    var session:NSURLSession!

    // *** create IBOutlet of it and connect with indicator ***
    let indicator = UIActivityIndicatorView()

    // *** Hide indicator when stop animating ***
    indicator.hidesWhenStopped = true

    sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    sessionConfiguration.timeoutIntervalForResource = 60
    sessionConfiguration.timeoutIntervalForResource = 120
    sessionConfiguration.requestCachePolicy = .ReloadIgnoringLocalAndRemoteCacheData

    session = NSURLSession(configuration: sessionConfiguration)

    let requestURLString = "http://Your API URL"
    let request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: requestURLString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)!)

    // *** start indicator before sending request ***
    indicator.startAnimating()
    let task = session.dataTaskWithRequest(request)  (data, response, error) in

        // *** hide indicator on response on Main Thread ***
        dispatch_async(dispatch_get_main_queue(), 
            indicator.stopAnimating()
        )

        if let httpResponse = response as? NSHTTPURLResponse 
            switch httpResponse.statusCode
            
            case 200:

                print("Successful response.")

            default:
                print("Error :\(error?.localizedDescription)")
            
        
    

    task.resume()

【讨论】:

我会试试看.. 非常感谢兄弟【参考方案2】:

是的,你必须使用 NSURLSessionDownloadDelegate 和它的方法:

【讨论】:

以上是关于我们可以像在 android asyncTask 中一样显示加载状态,直到我们在 swift 中使用 HTTP Post 请求得到响应的主要内容,如果未能解决你的问题,请参考以下文章

android中的asynctask可不可以并行执行多个

Android 源码解析之AsyncTask

Android AsyncTask

Android AsyncTask

Android_AsyncTask异步任务

Android_AsyncTask异步任务机制