gpt4 book ai didi

ios - 如何知道 dispatch_async 正在运行 ios

转载 作者:行者123 更新时间:2023-11-28 19:58:50 25 4
gpt4 key购买 nike

我正在寻找一个小场景,我们如何跟踪“dispatch_async”是否正在运行?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
(unsigned long)NULL), ^(void) {
//back ground process
});

在我的例子中,我的应用程序将在前台启动后台线程,当我将应用程序从后台转到前台时,我需要检查它是否仍在运行。如果它仍在运行,我不应该调用相同的进程。有什么想法吗?

最佳答案

最简单的方法(无需保留对每个分派(dispatch)的引用或用于进入/离开异步任务的标志)是使用 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

被调用。

您应该将线程设置为可以使用这样的回调来确定状态的位置。您应该尽量避免使用 bool 标志,因为这正是调度组的用途。使用 bool 状态跟踪大量异步调用也很困难。

链接:dispatch groups

关于ios - 如何知道 dispatch_async 正在运行 ios,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com