我正在使用以下代码运行任务,
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
方法的运行实例。即如果任务仍在运行,我不想运行新线程,但想等到它完成。
任何想法如何做到这一点?
答案 0 :(得分:4)
GCD和块不支持他们自己,但你可以使它工作。
你可以有一个可变集,其中块在它们启动时自己添加它们并在它们完成时删除它们(即它们做的第一件也是最后一件事)或者去更高的抽象(NSOperation)。
如果您将块本身(或某些唯一键,如他们正在上传的资源)添加到可变集中,那么您可以查询该集并查看是否已使用[runningBlocksSet containsObject:myNewBlockForResoucreThatImAboutToUpload]
上传该资源(对不起,极长的变量名。)。
NSOperation
查看isExecuting
如果您在另一方选择使用NSOperations进行上传,那么他们已经支持使用[myUploadOperation isExecuting]
检查它们是否正在运行。您还可以检查它是否已取消,是否已完成,或者是否已准备就绪(操作可能具有依赖关系,并且在它们所依赖的所有操作完成之前尚未准备好运行)。