2014-08-28 2 views
0

У меня есть кэш файлов, в которых мне нужно писать/читать изображения.Очистить очередь GCD для всех остальных запросов в очереди

Вся работа с файловой системой должна выполняться в фоновом режиме.

Для этих целей для сохранения файлов я использую:

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, но не могу их реализовать, к сожалению. Кто-нибудь может мне с этим помочь?

+0

Разве вы не имеете в виду «кеш» вместо «наличных»? – Koen

+0

Да, извините En не мой родной язык – ShurupuS

+0

Не стоит беспокоиться, и это не мое :) Я думал, что это смешная опечатка! – Koen

ответ

0

Вы можете использовать NSOperationQueue с maxConcurrentOperationCount = 1 (это сделает очередную очередь) для запуска NSOperation, который загрузит ваши изображения; NSOperation - это отменимый объект. Также вы можете устанавливать зависимости между операциями.

P.S. Вы можете просмотреть SDWebImage, он содержит класс SDImageCache. Этот класс очень хорош для управления кешем изображений.

+2

Это заслуживает разработки; После отправки в очередь GCD блоки не отменяются по сути. Если вы хотите отменить поведение, вы должны создать его в своем блоке, попросив их проверить внешнее состояние, чтобы определить, должны ли они немедленно вернуться или продолжить работу. 'NSOperation' и' NSOperationQueue' являются абстракциями более высокого уровня, которые имеют это поведение отмены. – ipmcc

Смежные вопросы