我希望能夠在登錄後從我們的服務器下載一些數據。有沒有一種方法可以設置它,以便當用戶去到程序的那一部分(比如它的下載食譜),我可以檢查是否有當前下載的新配方尚未保存?檢查一個線程(使用GCD)是否存在或已經完成
如果用戶轉到食譜並看到目前正在下載新食譜的某種指示符,那將會很不錯。
我可以命名線程嗎?我可以把所有的「食譜」線程放在堆棧中,並檢查它是否爲空或者是否有線程?
我正在使用GCD。
任何想法?
我希望能夠在登錄後從我們的服務器下載一些數據。有沒有一種方法可以設置它,以便當用戶去到程序的那一部分(比如它的下載食譜),我可以檢查是否有當前下載的新配方尚未保存?檢查一個線程(使用GCD)是否存在或已經完成
如果用戶轉到食譜並看到目前正在下載新食譜的某種指示符,那將會很不錯。
我可以命名線程嗎?我可以把所有的「食譜」線程放在堆棧中,並檢查它是否爲空或者是否有線程?
我正在使用GCD。
任何想法?
而不是檢查調度隊列的狀態,我會建議你的模型有一個屬性,指示下載的狀態。您可以讓GCD代碼在下載開始時將狀態更改爲「下載」,然後在下載完成後將該狀態更改回其他內容。由於您似乎有多個想要與此後臺下載操作交互的視圖控制器,因此您可能需要使用本地通知(或KVN),以便任何依賴於模型狀態的視圖都可以在適當的時候自行更新。
如果您使用操作隊列而不是調度隊列(這對於其他原因也很有用,例如您希望同時下載,但希望將此限制爲一些合理的數字),理論上可以使用operationCount
,但我會仍然傾向於保持上述的下載狀態模型屬性。
這是我如果使用GCD(未經測試,但收集的教訓是,當您的下載完成並結合全局標誌來指示下載過程的狀態時,您可以使用dispatch_group_notify
)。
-(void)downloadRecipes
{
//<--Start activity indicator-->
//isDownloading = YES; //<- Some global flag to indicate download in progress
//--or--
//[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadDidBegin"];
dispatch_block_t executionBlock =
^{
//Your download logic here
};
dispatch_block_t executionBlock_OnComplete =
^{
//isDownloading = NO; //<- Global flag indicates no longer downloading
//--or--
//[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadDidEnd"];
//<--Stop activity indicator-->
};
dispatch_queue_t someQueue = dispatch_queue_create("com.myapp.recipe.download", NULL);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, someQueue, executionBlock);
dispatch_group_notify(group, dispatch_get_main_queue(), executionBlock_OnComplete);
dispatch_release(group);
dispatch_release(queue);
}
可選地,而不是設置一個全局標誌,您可以使用NSNotificationCenter
張貼通知時,進程已經開始,以及當它已經完成的。
在回答您的問題時,您可以將您[創建]的調度隊列命名爲(https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#// apple_ref/c/func/dispatch_queue_create),但不是您分派到該隊列的各個塊。隊列名稱比其他任何東西都更適用於診斷目的(在調試時,如果你看到你的線程列表,你可以看到一個有意義的名字)。 – Rob 2013-03-08 18:02:55