我们可以像在 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)
的大括号内的所有内容都将被执行,因此您可以将文本放在文本字段中并停止加载指标等
您可以使用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 请求得到响应的主要内容,如果未能解决你的问题,请参考以下文章