2

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

如果用户去菜谱,并看到某种指示它当前正在下载新菜谱,那就太好了。

我可以命名线程吗?我可以将所有“配方”线程放入堆栈并检查它是空的还是里面有线程?

我正在使用 GCD。

有任何想法吗?

4

2 回答 2

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在进程开始和完成时发布通知,而不是设置全局标志。

于 2013-03-08T16:34:10.587 回答
3

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

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

于 2013-03-08T16:29:26.743 回答