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

我对快速编程很陌生。我了解到 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) 的大括号内的所有内容都将被执行,因此您可以将文本放在文本字段中并停止加载指标等
  • 实际上没关系,信号量会停止它,但这是不好的做法,因为它可能会导致您的应用程序冻结,直到响应从服务器返回,除非整个方法在后台线程
  • 你能解释一下如何在后台线程中执行整个方法。我根据你的建议尝试过,但找不到正确的方法。

标签: ios swift


【解决方案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 和它的方法:

【讨论】:

    最近更新 更多