2013-08-30 2 views
1

나는 공장 메서드로 만든 많은 NSFetchedResultsController 인스턴스가 많은 앱을 작성하고 있습니다.NSFetchedResultsController에 대한 캐시 이름을 생성하는 일반적인 방법

이제 컨트롤러의 캐시 이름을 일반적으로 속성 (연결 엔티티 이름, 조건 자, 정보 정렬 ...)에서 생성하려고합니다. 그것은 좋은 방법

  • 이다 : 누군가가 전에 이런 짓을 한 경우

    , 경험을 공유하세요?

  • 캐시 이름은 정확히 어떻게 만들어야합니까?

    이 이미 NSFetchedResultsControllers 구현 자체에 의해 처리되지 않는 이유도 궁금 : 측면 생각으로

. 왜 수동으로 캐시 이름을 지정해야할까요? 오류가 발생하기 쉬운 오버 헤드가있는 것 같습니다. 아니면 여기에 뭔가 빠졌나요?

답변

1

놀랍습니다. 아무도 관심을 보이지 않습니다. 나는 동적으로 생성 된 많은 resultsControllers를 다루는 모든 사람들이 이것을 필요로 할 것이라고 추측했을 것입니다!

// NSFetchedResultsController+GenericCache 

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest 
     managedObjectContext:(NSManagedObjectContext *)context 
     sectionNameKeyPath:(NSString *)sectionNameKeyPath 
        useCache:(BOOL)useCache { 
    NSString *cacheId = nil; 
    if (useCache) { 
     cacheId = [NSString stringWithFormat:@"%@-%@-%@" 
        , sectionNameKeyPath 
        , [fetchRequest entityName] 
        , [[fetchRequest predicate] predicateFormat]]; 
     for (NSSortDescriptor *descriptor in [fetchRequest sortDescriptors]) { 
      NSString *sortId = [NSString stringWithFormat:@"-%@-%@-%@" 
           , [descriptor key] 
           , ([descriptor ascending]) ? @"ascending": @"descending" 
           , NSStringFromSelector([descriptor selector])]; 
      cacheId = [cacheId stringByAppendingString:sortId]; 
     } 
    } 
    return [self initWithFetchRequest:fetchRequest 
       managedObjectContext:context 
        sectionNameKeyPath:sectionNameKeyPath 
          cacheName:cacheId]; 
} 

- (void)deleteCache { 
    [[self class] deleteCacheWithName:[self cacheName]]; 
} 

난 아직도 테스트하고 내가 개선을위한 & 제안을 비판하는 것은 매우 개방 이니

어쨌든, 여기 내 솔루션입니다.

신뢰할 수 있도록 도와주세요.

관련 문제