2011-01-13 3 views
0

ユーザー名とパスワードを使用してログインする必要のあるiOSアプリケーションを作成しています。このユーザー名とパスワードは、認証されるWebサーバーに送信されます。要求を送信して応答を待つ間、私はUIActivityIndi​​catorを表示します。UIがすぐにスピナーを表示しない

問題は、UIActivityIndi​​catorがすぐにボタンの押下などに表示され、数秒後に表示されることがあることです。 UIが更新される前にOSが別のスレッドを実行しているためだと思っていますが、誰かがこの遅延を引き起こす可能性があるかどうかを知りたいのですか?

以下の私のコード:

-(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の非同期インターフェイスでもこれを行うことができない場合は、最初にUIを更新するようにrunloopを戻してから(アクティビティインジケータを開始する)、次のようにタスクを開始します。

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

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

しかし、私が言ったように、これは一般的に悪い習慣がある...私はそれが必要なものを正確に行うようだ

+0

おかげOMZ、。残念ながら私は、アプリケーションが使用するすべてのデータが最新のものでなければならないため、ユーザーを待たせる必要があります。電話には何も保存できません – williamb

関連する問題