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