更正异步身份验证,同时保持响应 UI

Correct asynchronous Authentication while keeping a responsive UI

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

现在怎么样 我单击 sendButton,UI 冻结。即使 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.
}

登录管理器

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: "") 正在调用其中的异步函数,这意味着它不会阻塞下一行代码...是(我猜)触发你的加载屏幕再次变得不可见的那个。

基本上,您的加载屏幕 显示的,但它立即又被隐藏了。要至少修复加载屏幕的部分,请将第三行代码放在回调方法 loginManagerDidFinishAuthenticationForUserbuttonTouchedUpInside 函数中。