[英]how to know dispatch_async is running ios
我正在寻找一个小场景,该场景如何跟踪“ dispatch_async”是否正在运行?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
//back ground process
});
就我而言,我的应用程序将位于前台,我启动了后台线程,当我将应用程序从后台移至前台时,我需要检查其是否仍在运行。 如果它仍在运行,则不应调用相同的进程。 任何想法?
最简单的方法(不保留对每个调度的引用,也不保留用于输入/离开异步任务的标志)是使用dispatch_group通知。 请参见下面的示例链接和代码:
- (void)downloadPhotosWithCompletionBlock:(BatchPhotoDownloadingCompletionBlock)completionBlock
{
// 1
__block NSError *error;
dispatch_group_t downloadGroup = dispatch_group_create();
for (NSInteger i = 0; i < 3; i++) {
NSURL *url;
switch (i) {
case 0:
url = [NSURL URLWithString:kOverlyAttachedGirlfriendURLString];
break;
case 1:
url = [NSURL URLWithString:kSuccessKidURLString];
break;
case 2:
url = [NSURL URLWithString:kLotsOfFacesURLString];
break;
default:
break;
}
dispatch_group_enter(downloadGroup); // 2
Photo *photo = [[Photo alloc] initwithURL:url
withCompletionBlock:^(UIImage *image, NSError *_error) {
if (_error) {
error = _error;
}
dispatch_group_leave(downloadGroup); // 3
}];
[[PhotoManager sharedManager] addPhoto:photo];
}
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{ // 4
if (completionBlock) {
completionBlock(error);
}
});
}
注意如何:
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{ // 4
if (completionBlock) {
completionBlock(error);
}
});
直到之后才会被调用
dispatch_group_leave(downloadGroup); // 3
叫做。
您应该将线程设置为可以在其中使用此类回调以确定状态的位置。 您应该不惜一切代价避免使用布尔值标志,因为这正是调度组的用途。 使用布尔状态跟踪大量异步调用也很困难。
链接: 调度组
问题是错误的-调用时dispatch_async正在运行,而在调用返回时停止运行,这实际上是立即的。 您真正想知道的是调度块是否正在运行。 最简单的方法是
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[self blockIsRunning:YES];
// do stuff
[self blockIsRunning:NO];
});
或者,如果您想知道该块是否已运行一次 ,则可以执行以下操作
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[self blockStarted];
// do stuff
[self blockFinished];
});
或者,使用NSOperationQueue和NSOperation的子类,因此可以使用一个适当的对象来询问它是否已准备好,已取消,正在执行或已完成,而不是一个匿名块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.