2014-08-28 1 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

이미지를로드 할 NSOperation 실행을 위해 maxConcurrentOperationCount = 1 (직렬 대기열을 만듭니다)의 NSOperationQueue를 사용할 수 있습니다. NSOperation이 취소 가능한 개체입니다. 또한 작업간에 종속성을 만들 수도 있습니다.

P. SDImageCache 클래스가 포함 된 SDWebImage를 볼 수 있습니다. 이 클래스는 이미지 캐시 관리에 매우 좋습니다.

+2

이것은 정교하게 받아 들여야 만합니다. 일단 GCD 대기열에 제출되면 블록은 본질적으로 취소 할 수 없습니다. 취소 행동을 원할 경우, 즉시 외부로 돌아와야하는지 아니면 자신의 일을 계속해야하는지 결정하기 위해 외부 상태를 확인하도록하여 블록에 추가해야합니다. 'NSOperation'과'NSOperationQueue'는이 취소 동작이 내장 된 더 높은 수준의 추상화입니다. – ipmcc