清除队列中所有其余请求的GCD队列

时间:2014-08-28 06:49:47

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

我有一个文件缓存,我需要在其中写入/读取图像。

我需要在后台执行文件系统的所有工作。

为了保存我使用的文件:

dispatch_barrier_async([AxPanoramaDataManager sharedInstance].dataManagerQueue, ^{
    [data writeToFile:tileFilePathName atomically:YES];
});

阅读:

    __block UIImage *tileImage = nil;
    dispatch_sync([AxPanoramaDataManager sharedInstance].dataManagerQueue, ^{
        tileImage = [[UIImage imageWithContentsOfFile:tileFilePathName] retain];
        dispatch_async(dispatch_get_main_queue(), ^{
            completion (tileCoordValue, side, tileImage, error);
            [tileImage release];
        });
    });

一切运作良好,现金文件夹中有大量文件,但有时我需要清理现金。我需要取消所有队列块并执行清理文件夹的块。

我对该方法的第一个实现如下:

+ (void) cleanCash
{
    NSString *folderPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"cash"];
    dispatch_sync([AxPanoramaDataManager sharedInstance].dataManagerQueue, ^{
        NSError *error = nil;
            [[NSFileManager defaultManager] removeItemAtPath:folderPath error:&error];
            NSParameterAssert(error == nil);
        }
    });
}

但是我遇到了很多问题,因为它没有取消队列中的所有等待操作。我尝试在SO中查找解决方案,但不幸的是无法实现它们。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

你可以使用NSOperationQueue和maxConcurrentOperationCount = 1(它将建立一个串行队列)来运行NSOperation来加载你的图像; NSOperation是一个可取消的对象。您还可以在操作之间建立依赖关系。

P.S。 您可以查看SDWebImage,它包含SDImageCache类。它类非常适合管理图像缓存。