更正异步身份验证,同时保持响应 UI
Correct asynchronous Authentication while keeping a responsive UI
它应该是什么
我有一个用户名字段。输入用户名并单击 sendButton 时,将使用异步请求将用户数据作为 JSON 文件获取。
单击 sendButton 后,我想显示一个 ActivityIndicator。
在发出请求时,UI 仍应响应。
现在怎么样
我单击 sendButton,UI 冻结。即使 ActivityIndicator 也不会显示。
代码
LoginVC:
func buttonTouchedUpInside(sender: UIButton) {
toggleActivityIndicatorVisibilityOn(true)
LoginManager.sharedInstance.checkUserForCredentials(username: textFieldLogin.text, password: "")
toggleActivityIndicatorVisibilityOn(false)
}
func loginManagerDidFinishAuthenticationForUser(userData: [String:String]?){
// Delegate Method, which works with the fetched userData.
}
登录管理器
func checkUserForCredentials(#username: String ,password: String) -> Void {
let url = NSURL(string: "\(Config.checkCredentialsUrl)username=\(username)")
let request = NSURLRequest(URL: url!)
NSURLConnection.sendAsynchronousRequest(request, queue: .mainQueue()) { (response, data, error) -> Void in
if error != nil {
//Display error-message
}
var error : NSError?
let json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &error) as? [String:String]
self.delegate?.loginManagerDidFinishAuthenticationForUser(json)
}
}
简而言之:我希望在后台发出请求,显示 Activityindicator 并且 UI 保持响应。异步请求成功获取json后,调用delegate方法
buttonTouchedUpInside
方法中的第二行代码 LoginManager.sharedInstance.checkUserForCredentials(username: textFieldLogin.text, password: "")
正在调用其中的异步函数,这意味着它不会阻塞下一行代码...是(我猜)触发你的加载屏幕再次变得不可见的那个。
基本上,您的加载屏幕 是 显示的,但它立即又被隐藏了。要至少修复加载屏幕的部分,请将第三行代码放在回调方法 loginManagerDidFinishAuthenticationForUser
的 buttonTouchedUpInside
函数中。
它应该是什么 我有一个用户名字段。输入用户名并单击 sendButton 时,将使用异步请求将用户数据作为 JSON 文件获取。 单击 sendButton 后,我想显示一个 ActivityIndicator。 在发出请求时,UI 仍应响应。
现在怎么样 我单击 sendButton,UI 冻结。即使 ActivityIndicator 也不会显示。
代码
LoginVC:
func buttonTouchedUpInside(sender: UIButton) {
toggleActivityIndicatorVisibilityOn(true)
LoginManager.sharedInstance.checkUserForCredentials(username: textFieldLogin.text, password: "")
toggleActivityIndicatorVisibilityOn(false)
}
func loginManagerDidFinishAuthenticationForUser(userData: [String:String]?){
// Delegate Method, which works with the fetched userData.
}
登录管理器
func checkUserForCredentials(#username: String ,password: String) -> Void {
let url = NSURL(string: "\(Config.checkCredentialsUrl)username=\(username)")
let request = NSURLRequest(URL: url!)
NSURLConnection.sendAsynchronousRequest(request, queue: .mainQueue()) { (response, data, error) -> Void in
if error != nil {
//Display error-message
}
var error : NSError?
let json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &error) as? [String:String]
self.delegate?.loginManagerDidFinishAuthenticationForUser(json)
}
}
简而言之:我希望在后台发出请求,显示 Activityindicator 并且 UI 保持响应。异步请求成功获取json后,调用delegate方法
buttonTouchedUpInside
方法中的第二行代码 LoginManager.sharedInstance.checkUserForCredentials(username: textFieldLogin.text, password: "")
正在调用其中的异步函数,这意味着它不会阻塞下一行代码...是(我猜)触发你的加载屏幕再次变得不可见的那个。
基本上,您的加载屏幕 是 显示的,但它立即又被隐藏了。要至少修复加载屏幕的部分,请将第三行代码放在回调方法 loginManagerDidFinishAuthenticationForUser
的 buttonTouchedUpInside
函数中。