2012-01-24 3 views
1

웹 서비스에서 정보를 다운로드하고 메모리에 캐시하는 응용 프로그램이 있습니다. 특히, 내 싱글 톤 캐시 클래스는 캐시 된 모든 데이터를 포함하는 인스턴스 변수 NSMutableDictionary *memoryDirectory을 포함합니다. 이 캐시의 데이터를 쉽게 다시 다운로드 할 수있다, 그래서 나는 UIApplicationDidReceiveMemoryWarningNotification를받을 때 나는 여기 스레드 안전에 대해 조금 걱정 단순히NSMutableDictionary 액세스 및 파기 스레드 안전

- (void) dumpCache:(NSNotification *)notification 
{ 
    memoryDirectory = nil; 
} 

를 호출 할 메소드를 호출한다. (나는 일반적으로 쓰레드에 대해 많이 알지 못하지만, 코코아의 구현에서는 훨씬 적다.) 캐시는 값이 변경 가능한 사전 인 변경 가능한 사전이므로 데이터에 액세스하는 데는 두 가지 레벨의 키가있다. 내가 캐시에 쓸 때 나는 같은 것을 할 :

- (void) addDataToCache:(NSData *)data 
       forKey:(NSString *) 
       subkey:(NSString *)subkey 
{ 
    if (!memoryDirectory) 
     memoryDirectory = [[NSMutableDictionary alloc] init]; 

    NSMutableDictionary *methodDictionary = [memoryDirectory objectForKey:key]; 
    if (!methodDictionary) { 
     [memoryDirectory setObject:[NSMutableDictionary dictionary] forKey:key]; 
     methodDictionary = [memoryDirectory objectForKey:key]; 
    } 

    [methodDictionary setObject:data forKey:subkey]; 
} 

내가 언젠가 과정의 중간에, dumpCache:가 전무 사전 외출 내가이 일을 남아있을 거라는 걱정 아무 것도하지 않는 setObject:forKey:의 무리. 이것은 치명적인 것은 아니지만, 내가 캐시를 읽는 동안 이런 일이 발생하면 문제가 발생할 것이라고 상상할 수 있습니다.

모든 캐시 읽기 및 쓰기를 어떤 종류의 @synchronized 블록으로 래핑하는 것으로 충분합니까? 그렇다면 어떻게해야할까요? (내 dumpCache:도 비슷하게 포장해야합니까?) 그렇지 않다면 어떻게해야 내가하고있는 일이 안전한지 확인할 수 있습니까?

+0

어쨌든 dumpCache가 잘못되었습니다. 캐시를 없애기에 충분하지 않습니다. 당신은 오히려 그것을 해제하고 새로운 것을 다시 할당하기를 원할 것입니다. 또는 단순히 setDictionary :를 빈 사전으로 바꾸기를 원합니다. –

+0

ARC를 사용하기 때문에 명시 적으로 해제 할 수 있다고 생각하지 않지만 빈 사전으로 설정하는 것은 쉽습니다. 그것은 if (! memoryDirectory)가 불필요하게 만들 것이고, 적어도 항상 초기화 될 것이기 때문이다. – bdesham

+0

체크하지 않아도됩니다. 메시지를 nil로 보내는 것은 합법적입니다. –

답변

2

NSMutableDictionary을 사용하는 대신 스레드 안전 인 NSCache을 사용하는 것이 좋습니다. 사용 예는 this answer을 참조하십시오. 행운을 빕니다!

+0

어쨌든 나는이 수업을 듣기조차하지 못했습니다. 감사! – bdesham

+0

NSCache는 훌륭하지만 때때로 메모리 부족에 대한 데이터를 삭제합니다. – delrox