2014-04-18 55 views
4

我正在開發一個需要登錄表單的項目,使用webservice進行驗證。我沒有連接到服務器的問題,但似乎NSURLSession阻止我的用戶界面,我真的不知道爲什麼經過很多調試。使用NSURLSession時UI被阻塞

爲了簡單起見,這裏是我的代碼簡稱:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"example.com/service"]]; 

//1 
    //_sessionLogin = [NSURLSession sessionWithConfiguration:sessionConfigurationLogin delegate:self delegateQueue:nil]; 
//2 //Whether I use 1 or 2, it acts the same way 

    _sessionLogin = [NSURLSession sharedSession]; 

    NSURLSessionDataTask *sessionDataTaskLogin = [_sessionLogin dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
    { 
     if(!error) 
     { 
      NSLog(@"loginWithSuccess"); 
      UIAlertView *alertError = [[UIAlertView alloc] initWithTitle:@"Login ok" message:@"ok" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil]; 
      [alertError show]; 

    } 
}]; 

//Begin login request 
[sessionDataTaskLogin resume]; 

_sessionLogin是NSURLSession

至於我的服務器的連接速度快,的NSLog(@ 「loginWithSuccess」)後,我似乎差不多吧按下登錄按鈕,但需要一段時間(很長一段時間),UIAlertView顯示的時間超過10秒。我也無法與用戶界面進行交互。

在此先感謝您的每一個解決方案。

+0

在另一個線程上執行異步請求或請求。 – Larme

+0

我沒有創建任何線程。這些代碼位於我的登錄按鈕中。這是程序第一步的登錄表單。 –

+3

@Larme他這樣做是異步的。問題是完成塊(並且因此警報視圖)沒有在主線程上運行。 – Rob

回答

10

您的完成塊沒有在主線程上運行。由於UI更新必須在主線程中發生,因此應該將警報視圖分派給主隊列,並且您會立即看到它。

NSURLSessionDataTask *sessionDataTaskLogin = [_sessionLogin dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if (!error) { 
     NSLog(@"loginWithSuccess"); 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      UIAlertView *alertError = [[UIAlertView alloc] initWithTitle:@"Login ok" message:@"ok" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil]; 
      [alertError show]; 
     }); 
    } 
}]; 
+1

我懂了!非常感謝! –

+1

我也有同樣的問題,你的解決方案是完美的 – rinkesh