GCD:如何检查任务是否正在运行

时间:2012-07-15 14:54:21

标签: ios objective-c grand-central-dispatch

我正在使用以下代码运行任务,

mTimerForImageUpload = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (mTimerForImageUpload) {
    dispatch_source_set_timer(mTimerForImageUpload, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * uploadCheckInterval), NSEC_PER_SEC * uploadCheckInterval, leeway);
    dispatch_source_set_event_handler(mTimerForImageUpload, ^{
        [self uploadData];
    });
    dispatch_resume(mTimerForImageUpload);
}

基本上我希望同时只有一个uploadData方法的运行实例。即如果任务仍在运行,我不想运行新线程,但想等到它完成。

任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:4)

GCD和块不支持他们自己,但你可以使它工作。

你可以有一个可变集,其中块在它们启动时自己添加它们并在它们完成时删除它们(即它们做的第一件也是最后一件事)或者去更高的抽象(NSOperation)。

自己跟踪跑步障碍

如果您将块本身(或某些唯一键,如他们正在上传的资源)添加到可变集中,那么您可以查询该集并查看是否已使用[runningBlocksSet containsObject:myNewBlockForResoucreThatImAboutToUpload]上传该资源(对不起,极长的变量名。)。

使用NSOperation查看isExecuting

如果您在另一方选择使用NSOperations进行上传,那么他们已经支持使用[myUploadOperation isExecuting]检查它们是否正在运行。您还可以检查它是否已取消,是否已完成,或者是否已准备就绪(操作可能具有依赖关系,并且在它们所依赖的所有操作完成之前尚未准备好运行)。