我正在寻找一个小方案,我们如何追踪" dispatch_async"是否正在运行?。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
//back ground process
});
在我的情况下,我的应用程序将在前台我启动了后台线程,当我将应用程序从后台运行到前台时,我需要检查它是否仍在运行。如果它仍在运行,我不应该调用相同的进程。任何想法?
答案 0 :(得分:2)
执行此操作的最简单方法(不保留对每个调度的引用或用于进入/离开异步任务的标志)是使用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
被召唤。
您应该将线程设置为可以使用此类回调来确定状态的位置。您应该尽量避免使用布尔标志,因为这正是调度组的用途。使用布尔状态跟踪大量异步调用也很困难。
link:dispatch groups
答案 1 :(得分:1)
问题是错误的 - 调用时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的子类,因此您可以使用正确的对象代替匿名块,可以询问它是否已准备好,已取消,正在执行或已完成。