2013-04-10 179 views
1

我在iOS應用程序中實現了一些RESTful API,目前我正在開發登錄功能。用戶輸入用戶名和密碼,當按下登錄時,會發生以下情況:iOS 5+ - 執行請求時凍結主線程執行

網絡活動指示變爲可見,文本標籤變爲隱藏(以及登錄按鈕),活動指示變爲可見,帶有文字「簽入」的標籤。然後:

dispatch_async(queue, 
    ^{[self performSelectorOnMainThread:@selector(performAuthCall) 
    withObject:nil waitUntilDone:YES];}); 

在performAuthCall方法中,視圖控制器的屬性(一個布爾)被設置爲是或否,取決於如果登錄成功與否(I使用NSURLConnection的的sendSynchronousRequest)。如果是,則會呈現另一個視圖控制器。如果不是,則顯示警報。 我沒有真正得到我要去的結果,控制器在執行請求之前正在測試成功的登錄布爾值,並且我嘗試了不同的方法,但是我無法讓它正常工作並且不凍結UI。所以,我的問題是:

我怎樣才能使所有的隱藏/顯示的東西第一(如使可見的活動指標和「登錄」標籤),然後開始授權過程,等到它完成,只然後繼續到另一個視圖控制器或顯示警報或東西?

+1

不要阻塞主線程。 – 2013-04-10 14:21:59

回答

1

使用NSURLConnection sendAsynchronousRequest:::代替

[NSURLConnection sendAsynchronousRequest:request 
           queue:[NSOperationQueue currentQueue] 
        completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSLog(@"response = %@", response); 
    //do the UI update/segue here once completed. 
}]; 

這樣你就不會阻止URL加載過程中主線程。

+0

感謝隊友,救了我! :-) – nemesis 2013-04-10 17:14:00

0

要建立在Mike關於使用背景和獲得功能的答案上,我認爲您正在尋找的是執行以下操作。

將您所擁有的動作綁定在點擊登錄按鈕上以激活一種方法。這仍將處於前景。立即派遣後臺您的應用程序邏輯來處理消息。如果需要,您的後臺方法(performAuthCall)仍然可以運行同步。

dispatch_async(dispatch_get_global_queue(0, 0), 
        ^{ 
          [self performAuthCall]; 
         }); 

此外,在您調度的同一方法中,設置您的布爾來阻止呼叫,灰色按鈕,開始您的活動控制。主線程仍然可以正常工作,但是攔截像shouldPerformSegueWithIdentifier這樣的項目將允許您阻止不需要的導航。

當performAuthCall完成後,讓它在主線程上執行一個選擇器以設置bools,以便方法可以開始移動,不使用項目,停止活動控制。它還決定您是啓動警報(錯誤密碼)還是強制繼續進入下一個控制器。

記住 - UI需要在主線程中的所有東西,並且所有額外的邏輯(如做類似登錄調用的東西)都應該在後臺線程中。