如何知道dispatch_async正在运行ios

时间:2014-08-02 13:55:23

标签: ios grand-central-dispatch

我正在寻找一个小方案,我们如何追踪" dispatch_async"是否正在运行?。

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

在我的情况下,我的应用程序将在前台我启动了后台线程,当我将应用程序从后台运行到前台时,我需要检查它是否仍在运行。如果它仍在运行,我不应该调用相同的进程。任何想法?

2 个答案:

答案 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的子类,因此您可以使用正确的对象代替匿名块,可以询问它是否已准备好,已取消,正在执行或已完成。