2013-03-08 75 views
1

我希望能夠在登錄後從我們的服務器下載一些數據。有沒有一種方法可以設置它,以便當用戶去到程序的那一部分(比如它的下載食譜),我可以檢查是否有當前下載的新配方尚未保存?檢查一個線程(使用GCD)是否存在或已經完成

如果用戶轉到食譜並看到目前正在下載新食譜的某種指示符,那將會很不錯。

我可以命名線程嗎?我可以把所有的「食譜」線程放在堆棧中,並檢查它是否爲空或者是否有線程?

我正在使用GCD。

任何想法?

+0

在回答您的問題時,您可以將您[創建]的調度隊列命名爲(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

回答

3

而不是檢查調度隊列的狀態,我會建議你的模型有一個屬性,指示下載的狀態。您可以讓GCD代碼在下載開始時將狀態更改爲「下載」,然後在下載完成後將該狀態更改回其他內容。由於您似乎有多個想要與此後臺下載操作交互的視圖控制器,因此您可能需要使用本地通知(或KVN),以便任何依賴於模型狀態的視圖都可以在適當的時候自行更新。

如果您使用操作隊列而不是調度隊列(這對於其他原因也很有用,例如您希望同時下載,但希望將此限制爲一些合理的數字),理論上可以使用operationCount,但我會仍然傾向於保持上述的下載狀態模型屬性。

2

這是我如果使用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張貼通知時,進程已經開始,以及當它已經完成的。

相關問題