2013-03-08 32 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张贴通知时,进程已经开始,以及当它已经完成的。

相关问题