2015-05-06 28 views
0

它應該是什麼 我有一個用戶名字段。當輸入用戶名並單擊sendButton時,會將用戶數據作爲JSON文件提取一個asynchronousRequest。 單擊sendButton之後,我想要顯示一個ActivityIndi​​cator。 UI在提出請求的同時仍應具有響應性。正確的異步認證,同時保持響應式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. 
} 

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之後,代理方法將被稱爲

回答

2

buttonTouchedUpInside方法中代碼的第二行代碼LoginManager.sharedInstance.checkUserForCredentials(username: textFieldLogin.text, password: "")正在調用其中的異步函數,這意味着它不會阻塞下一行的代碼...這是(我猜)觸發你的加載屏幕變得不可見了。

基本上,您的加載屏幕顯示,但它立即被再次隱藏。要至少修復加載屏幕上的零件,請改用buttonTouchedUpInside函數中的第三行代碼,代之以回調方法loginManagerDidFinishAuthenticationForUser