我希望能够在他们登录后在后台从我们的服务器下载一些数据。有没有办法可以设置它,所以当用户进入程序的那个部分(比如下载食谱)时,我可以检查是否有尚未保存的新食谱的当前下载?
如果用户去菜谱,并看到某种指示它当前正在下载新菜谱,那就太好了。
我可以命名线程吗?我可以将所有“配方”线程放入堆栈并检查它是空的还是里面有线程?
我正在使用 GCD。
有任何想法吗?
我希望能够在他们登录后在后台从我们的服务器下载一些数据。有没有办法可以设置它,所以当用户进入程序的那个部分(比如下载食谱)时,我可以检查是否有尚未保存的新食谱的当前下载?
如果用户去菜谱,并看到某种指示它当前正在下载新菜谱,那就太好了。
我可以命名线程吗?我可以将所有“配方”线程放入堆栈并检查它是空的还是里面有线程?
我正在使用 GCD。
有任何想法吗?
这就是我在使用 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
在进程开始和完成时发布通知,而不是设置全局标志。
我建议您的模型具有指示下载状态的属性,而不是检查调度队列的状态。您可以让您的 GCD 代码在下载开始时将状态更改为“正在下载”,然后在下载完成后将该状态更改回其他状态。因为您似乎有多个视图控制器想要与此后台下载操作进行交互,所以您可能需要使用本地通知(或 KVN),以便任何依赖于模型状态的视图都可以在适当的时间自行更新。
如果您使用操作队列而不是调度队列(这对于其他原因也很有用,例如您想要并发下载但希望将其限制在某个合理的数量),理论上您可以使用operationCount
,但我仍然倾向于维护如上所述的下载状态模型属性。