繁体   English   中英

如何知道dispatch_async正在运行ios

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM