這是我至少在iOS編程中理解的事情之一。當我使用導航控制器推送視圖時,我需要讀取包含大量數據的文本文件,這需要大約2-3秒的時間來處理,同時創建新視圖。需要關於異步任務的一些解釋
所以我想異步處理這個文件,以便同時顯示一個ActivityIndicator。
我已經使用,在其他項目中,連接功能(connection
,connectionDidFinishLoading
...),但這裏因爲數據已經在我的項目文件,我想要做的是不同的,所以不需要連接。
感謝您的幫助和建議。
這是我至少在iOS編程中理解的事情之一。當我使用導航控制器推送視圖時,我需要讀取包含大量數據的文本文件,這需要大約2-3秒的時間來處理,同時創建新視圖。需要關於異步任務的一些解釋
所以我想異步處理這個文件,以便同時顯示一個ActivityIndicator。
我已經使用,在其他項目中,連接功能(connection
,connectionDidFinishLoading
...),但這裏因爲數據已經在我的項目文件,我想要做的是不同的,所以不需要連接。
感謝您的幫助和建議。
一個異步調用(正如我相信你已經知道的那樣)是在單獨的線程上調用的東西,而主線程繼續向前。 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。
你可以在後臺線程(dispatch_async)中讀取文本文件,然後在主線程上調用回調方法,如果你提供了一些負載/活動指示符,返回那裏的東西 – ogres 2013-04-04 07:39:23