我希望能够在登录后从我们的服务器下载一些数据。有没有一种方法可以设置它,以便当用户去到程序的那一部分(比如它的下载食谱),我可以检查是否有当前下载的新配方尚未保存?检查一个线程(使用GCD)是否存在或已经完成
如果用户转到食谱并看到目前正在下载新食谱的某种指示符,那将会很不错。
我可以命名线程吗?我可以把所有的“食谱”线程放在堆栈中,并检查它是否为空或者是否有线程?
我正在使用GCD。
任何想法?
我希望能够在登录后从我们的服务器下载一些数据。有没有一种方法可以设置它,以便当用户去到程序的那一部分(比如它的下载食谱),我可以检查是否有当前下载的新配方尚未保存?检查一个线程(使用GCD)是否存在或已经完成
如果用户转到食谱并看到目前正在下载新食谱的某种指示符,那将会很不错。
我可以命名线程吗?我可以把所有的“食谱”线程放在堆栈中,并检查它是否为空或者是否有线程?
我正在使用GCD。
任何想法?
而不是检查调度队列的状态,我会建议你的模型有一个属性,指示下载的状态。您可以让GCD代码在下载开始时将状态更改为“下载”,然后在下载完成后将该状态更改回其他内容。由于您似乎有多个想要与此后台下载操作交互的视图控制器,因此您可能需要使用本地通知(或KVN),以便任何依赖于模型状态的视图都可以在适当的时候自行更新。
如果您使用操作队列而不是调度队列(这对于其他原因也很有用,例如您希望同时下载,但希望将此限制为一些合理的数字),理论上可以使用operationCount
,但我会仍然倾向于保持上述的下载状态模型属性。
这是我如果使用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
张贴通知时,进程已经开始,以及当它已经完成的。
在回答您的问题时,您可以将您[创建]的调度队列命名为(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