在保持响应式UI的同时纠正异步身份验证

时间:2015-05-06 19:20:37

标签: swift asynchronous nsurlrequest nsoperationqueue

应该是什么 我有一个用户名字段。输入用户名并单击sendButton时,将使用asynchronousRequest作为JSON文件提取userdata。 单击sendButton后,我想显示一个ActivityIndi​​cator。 在提出请求时,UI仍应响应。

现在如何 我点击sendButton,用户界面冻结了。甚至ActivityIndi​​cator也不会显示。

代码

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.
}

LoginManager

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后,将调用委托方法

1 个答案:

答案 0 :(得分:2)

buttonTouchedUpInside方法中的第二行代码,它读取LoginManager.sharedInstance.checkUserForCredentials(username: textFieldLogin.text, password: "")正在调用其中的异步函数,这意味着它不会阻塞下一行代码...这就是一个(我猜)会触发你的加载屏幕再次变得不可见。

基本上,您的加载屏幕显示,但会立即再次隐藏。要使用加载屏幕修复至少部分,请将第三行代码放在回调方法buttonTouchedUpInside中的loginManagerDidFinishAuthenticationForUser函数中。