2011-01-13 29 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