2

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

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方法的实例。即,如果任务仍在运行,我不想运行新线程,而是想等到它完成。

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

4

1 回答 1

4

GCD 和块本身不支持这一点,但你可以让它工作。

您可以有一个可变集,其中块在开始时添加它们自己,并在它们完成时删除它们(即它们做的第一件事和最后一件事),或者转到更高的抽象(NSOperation)。

自己跟踪跑步积木

如果您将块本身(或它们正在上传的资源之类的唯一键)添加到可变集,那么您可以查询该集并查看该资源是否已被上传[runningBlocksSet containsObject:myNewBlockForResoucreThatImAboutToUpload](抱歉,变量名称过长)。

用于NSOperation查看是否isExecuting

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

于 2012-07-15T15:04:37.883 回答