检查线程(使用GCD)是否存在或已完成

时间:2013-03-08 16:06:54

标签: ios objective-c multithreading grand-central-dispatch

我希望能够在登录后从后台下载我们服务器中的一些数据。有没有办法可以设置它,以便当用户进入该程序的该部分时(比如下载配方) ,我可以检查是否有当前下载的新配方尚未保存?

如果用户使用食谱,并且看到某种类型的指示符正在下载新的食谱,那将会很不错。

我可以命名线程吗?我可以将所有“配方”线程放入堆栈并检查它是否为空或者是否有线程?

我正在使用GCD。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我建议您的模型具有指示下载状态的属性,而不是检查调度队列的状态。您可以让GCD代码在下载开始时将状态更改为“下载”,然后在下载完成后将该状态更改回其他状态。因为您似乎有多个想要与此后台下载操作交互的视图控制器,所以您可能希望使用本地通知(或KVN),以便依赖于模型状态的任何视图都可以在适当的时间自行更新。

如果您使用操作队列而不是调度队列(由于其他原因也很有用,例如您希望并发下载但希望将其限制为合理的数量),理论上您可以使用operationCount,但是我仍然倾向于维护上面列出的下载状态模型属性。

答案 1 :(得分:3)

如果使用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在流程开始时以及完成流程时发布通知,而不是设置全局标记。