2013-04-04 48 views
0

這是我至少在iOS編程中理解的事情之一。當我使用導航控制器推送視圖時,我需要讀取包含大量數據的文本文件,這需要大約2-3秒的時間來處理,同時創建新視圖。需要關於異步任務的一些解釋

所以我想異步處理這個文件,以便同時顯示一個ActivityIndi​​cator。

我已經使用,在其他項目中,連接功能(connectionconnectionDidFinishLoading ...),但這裏因爲數據已經在我的項目文件,我想要做的是不同的,所以不需要連接。

感謝您的幫助和建議。

+0

你可以在後臺線程(dispatch_async)中讀取文本文件,然後在主線程上調用回調方法,如果你提供了一些負載/活動指示符,返回那裏的東西 – ogres 2013-04-04 07:39:23

回答

1

一個異步調用(正如我相信你已經知道的那樣)是在單獨的線程上調用的東西,而主線程繼續向前。 Objective-C以這種方式運行,因爲如果調用是同步進行的,那麼UI(以及其他所有事情)只會在數據加載之前掛起。

好的,所以要在Objective-C中做到這一點,您需要有某種查詢數據的方法。如果它是在Core Data或SQLite中預加載的,則它或多或少是被調用的同一種方法。

有很多方法可以處理這個問題。我更喜歡塊,因爲它們簡單。

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
[User loginWithBlock:^(id responseObject, NSError *error) { 
    if (!error) { 
     NSLog(@"response object (the data): %@", responseObject); 
     [MBProgressHUD hideAllHUDsForView:self.view animated:YES]; 
    } 
}]; 

僅供參考,MBProgressHUD是活動指標。

所以,我們來分析一下。活動指示器被分配並顯示在視圖中,並將一直保留到調用該塊爲止,直到加載數據任務完成後纔會調用該活動指示器。數據完成加載後,塊將發送responseObject(您的數據),並隱藏活動指示器。

就這麼簡單!

編輯:

這確實是更一個附加的,但不管的。

要回答您的評論,要撥打電話或處理「數據處理」,loginWithBlock:函數是作爲它自己的函數構建的。

+ (void)loginWithBlock:(ObjectResultBlock)block 
{ 
    [[APIClient sharedClient] postPath:@"login" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     if (block) block(responseObject, nil); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (block) block(nil, error); 
    }]; 
} 

隨着塊的在其中創建這個函數的頭文件的聲明:

typedef void(^ObjectResultBlock)(id responseObject, NSError *error); 

這個特殊的例子是使用AFNetworking。但正如我之前所說,這一切都將看起來相當相同。

所以,讓我們打破這...

loginWithBlock:被調用,所以你執行APIClient調用,要麼成功,要麼失敗。在一個完美的世界中,它成功了,然後你通過該塊傳遞responseObject。

+0

好的,謝謝很多,而最後一件事我想知道在這段代碼中我的數據處理所對應的函數應該是或應該是什麼?它只是'loginWithBlock'函數? – Rob 2013-04-04 07:47:22

+0

爲了清晰起見,請參閱我的編輯。 – jakenberg 2013-04-04 08:09:05

+0

看到了,非常感謝。 – Rob 2013-04-04 08:12:58