我希望能够在登录后从后台下载我们服务器中的一些数据。有没有办法可以设置它,以便当用户进入该程序的该部分时(比如下载配方) ,我可以检查是否有当前下载的新配方尚未保存?
如果用户使用食谱,并且看到某种类型的指示符正在下载新的食谱,那将会很不错。
我可以命名线程吗?我可以将所有“配方”线程放入堆栈并检查它是否为空或者是否有线程?
我正在使用GCD。
有什么想法吗?
答案 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
在流程开始时以及完成流程时发布通知,而不是设置全局标记。