2010-01-24 3 views
2

나는 NSFetchedResultsController와 함께 UITableViewController를 사용하고있다.NSFetchedResultsController가 섹션 제목을 올바르게로드하지 않는 이유는 무엇입니까?

내 핵심 데이터 모델에 UITableView 섹션의 레이블로 사용할 임시 필드를 만들었습니다. 필드의 이름은 "sectionIndex"입니다. 내 응용 프로그램에서 "클라이언트"엔티티는 많은 "작업"(1 대 다수)을 가지고 있으므로 - 쿼리를 사용하여 Jobs를 검색하는 쿼리는 관련 "클라이언트의"이름으로 섹션을 통해 그룹화됩니다.

이 코드는 'Job'엔티티의 범주로 코드 기반에 구현했습니다.

@implementation Job (TransientMethods) 

- (NSString*)sectionIndex { 
    NSLog(@"JobWrapper.Job.sectionIndex: %@", self.client.name); 
    return self.client.name; 
} 

@end 

및 문자열 "sectionIndex"는 sectionNameKeyPath 인수로 NSFetchedResultsController의 init 메소드로 전달됩니다.

시뮬레이터에서 응용 프로그램을 지우는 경우 - 응용 프로그램이 처음 실행될 때 Jobs의 첫 페이지는 여기에 나열된 sectionIndex 메소드에 따라 작업의 Client.name별로 작업을 올바르게 검색하고 그룹화합니다. 로그에서는이 sectionIndex 메서드가 여러 번 호출되는 것을 문자 그대로 볼 수 있습니다.

그러나 이후 응용 프로그램을 실행해도 sectionIndex 메서드가 호출되지는 않지만 섹션 레이블은 마지막 실행의 값으로 계속 표시됩니다. 어떻게 된거야? 실행 사이에 마술 캐싱이 있습니까?

그러면 문제는 더 큰 문제로 이어집니다. UITableView를보고있는 동안, NSFetchedResultsController를 약간 다른 술어로 해제하고 할당하고 결과 세트가 같은 크기이면 ... 같은 결과, 원래 섹션 이름이 모든 새 결과에 표시됩니다!

물론 새로운 로그 항목이 없습니다. 이는 열이 결코 조회되지 않는다는 것을 의미하며 이는 코드가 호출하지 않거나 일시적인 필드를 조회하지 않음을 의미합니다. 마치 그 들판이 잘못하지 않는 것처럼 보입니다.

이제 대체 쿼리가 다른 수의 결과를 반환하면 섹션 이름이로드됩니다. IE :이 경우, 로그는 모든 bar 버튼 push - 'sectionIndex'메소드가 호출되고 해당 레이블이 UITableView에 표시됩니다.

2 개의 "활성"작업과 2 개의 "비활성"작업이 있고 해당 버튼을 사용하여 해당 검색어를 앞뒤로 전환하는 경우 ... 초기 검색어와 관련된 섹션 라벨이 무의미합니다. 모든 후속 테이블 뷰에 표시됩니다.

결과 집합에 다른 결과 # 개가있는 경우 sectionNameKeyPath 필드는 FetchedResultsController에 의해서만 호출되는 것 같습니다. 실제 결과는 다르다 - 작업 이름이 실제 행에 올바르게 표시된다 - 그러나 섹션 레이블이 잘못되었거나 섹션 레이블에 대해 NSFetchedResultsController를 올바르게 묻지 않는다고 생각한다. 다음을 사용하고 있습니다.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    int count = [[results_ sections] count]; 
    if (count > section) { 
     id <NSFetchedResultsSectionInfo> sectionInfo = [[results_ sections] objectAtIndex:section]; 
     return [sectionInfo name]; 
    } 
    return nil; 
} 

여기서 results_는 각 쿼리에 대해 작성중인 NSFetchedResultsController입니다.

내가 누락 된 항목이 있습니까? 수동으로 Core Data 캐시를 지우는 방법이 있습니까? 그렇다면 지능적이지 않고 모든 쿼리에서 반드시 sectionNameKeyPath를 찾습니다.

xcdatamodel의 필드에 대해 "Transient"옵션의 선택을 취소했지만 동일한 결과가 나타납니다.

마지막으로 비정상적으로 첫 번째 작업을 비활성 (기본 시작보기가 아님)으로 만들 때 - 활성 작업을 만드는 경우 ... 비활성 섹션 레이블이 둘 다 붙어 있습니다. 또한, 응용 프로그램을 종료하고 다시 시작하면 ... 비활성 화면 레이블이 여전히 표시됩니다. 제목 화면에서 완전히 다른 레이블을 표시해야하는 활성 작업을 표시하고 있습니다.

이것이 핵심 데이터 문제라고 생각할 수는 없습니다. 응용 프로그램을 다시 시작하면 갑자기 데이터가 반환된다는 것은 당연합니다.

+0

(동일한 시간에 실행)이 코드는 행에 대한 올바른 값을 표시 작업 * 작업 = (작업 *) [results_ objectAtIndexPath : indexPath]; cell.textLabel.text = job.name; 즉 : 쿼리가 실행 중이고 새로운 결과를 "results_"개체에서 사용할 수 있다는 것을 알고 있습니다. (stackoverflow의 주석 편집기는 포함 된 코드 스 니펫에서 필수 별표를 제거했습니다.) –

+1

NSFetchedResultsController 초기화 코드를 보여주십시오. 캐시 옵션이 있으며 캐시 세트가있는 것 같습니다. –

+0

실제로, 그것은 효과가있었습니다. 내가 사용하고 있었다 : results_ = [[NSFetchedResultsController alloc] initWithFetchRequest : fetchRequest managedObjectContext : context_ sectionNameKeyPath : @ "sectionIndex"cacheName : @ "JobsControllerCache"]; 캐시를 nil로 설정하면 작동합니다. 고맙습니다. –

답변

4

Marcus S. Zarra's 코멘트 당, 나는 cacheName을 설정에 무기 호 :

그런데
results_ = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
      managedObjectContext:context_ 
      sectionNameKeyPath:@"sectionIndex" 
      cacheName:nil]; 
관련 문제