2011-01-13 53 views
0

嘿,我創建的iOS應用程序需要用戶使用用戶名和密碼登錄,然後將此用戶名和密碼發送到Web服務器進行認證。當它發送請求並等待響應時,我顯示一個UIActivityIndi​​cator。用戶界面不能即時顯示微調框

我得到的問題是,有時UIActivityIndi​​cator會立即出現在按鈕按鈕上,而其他時間只有在幾秒鐘後纔會出現。我猜是因爲操作系統在更新用戶界面之前執行了另一個線程,但是我想知道是否有人確切地知道可能是什麼原因造成了這種延遲,或者只是說我的代碼有問題。

我下面的代碼:

-(void)loginPressed:(id)sender{ 

    if ([self validateForm]) { 

     [self startLoadingAnimation:@"CONNECTING"]; 

     [Session theSession].authenicatedUsername = usernameTextField.text; 
     [Session theSession].authenicatedPassword = passwordTextField.text; 

     usernameTextField.text = @""; 
     passwordTextField.text = @""; 

     [self setUserDetailsBasedOnUserID:[Session theSession].authenicatedUsername password:[Session theSession].authenicatedPassword]; 

    }else { 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"MISSING_LOGIN_DETAILS_TITLE", @"") 
                 message:NSLocalizedString(@"MISSING_LOGIN_MESSAGE", @"") 
                 delegate:self 
               cancelButtonTitle:NSLocalizedString(@"OK_BUTTON", @"") 
               otherButtonTitles:nil]; 

     [alert show]; 
     [alert release]; 
    } 
} 

感謝

回答

1

你應該做的異步聯網,否則,你會阻塞主(UI)線程同時可能等待很長的時間服務器響應(你不知道你的用戶有什麼樣的連接等等)。

如果你絕對無法在後臺線程或使用NSURLConnection的異步界面執行此操作,則可以先讓runloop返回以更新UI(啓動活動指示器),然後啓動任務,如下所示:

- (void)loginPressed:(id)sender { 
    [activityIndicator startAnimating]; 
    [self performSelector:@selector(doLogin) withObject:nil afterDelay:0.0]; 
} 

- (void)doLogin { 
    //perform your task here... 
} 

但正如我所說,這是一般不好的做法...

+0

感謝OMZ,似乎做的正是我需要它。可悲的是,我必須讓用戶等待,因爲應用程序使用的所有數據都必須是最新的,而且我無法在手機上存儲任何內容 – williamb 2011-01-13 17:28:52