2012-03-28 2 views
0

그래서이라는 설정fetchedResultsController 모범 사례

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    /* 
    Set up the fetched results controller. 
    */ 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:self.managedObjectContext_]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setReturnsObjectsAsFaults:NO]; 
    [fetchRequest setResultType:NSManagedObjectResultType]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"serviceName" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController_ = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 

    return fetchedResultsController_; 
} 

내가 NSFetchedResultsController *fetchedResultsController의 속성을 가지고 있고이 응용 프로그램 therough을 사용하고 내 핵심 데이터 엔티티의 모든를 가져 오는 다음 코드 를 통해 :

[self.fetchedResultsController_ fetchedObjects] 

문제는 내가 특정 자산, 즉와 엔티티를 가져 오기 할 수 있습니다 :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"settingName", somesettingName]; 
     [fetchRequest setPredicate:predicate]; 
: 술어

문제는 내가 새로운 fetchResultsControllerWithServiceName: (NSString *) serviceName 또는 그냥 기존의 방법을 사용한다 만들어야입니까? 이것에 대한 가장 좋은 방법은 무엇입니까?

답변

1

그것은 기존의 인출 요청 컨트롤러를 수정하기보다는 사용자가 원하는 조건을 업데이트 할 필요가있을 때마다 재현 (I가 얼마나 빨리 모르겠어요하지만) 확실히 빠르다. Apple의 설명서에는 "가져 오기 요청을 변경하는 경우 캐시를 사용해서는 안됩니다."라고 명시되어 있지만 현재 캐시를 사용하고 있지 않으므로 문제가되지 않습니다.

업데이트 된 결과를 얻으려면 술어를 업데이트하고 가져온 결과 컨트롤러에서 performFetch:을 호출하고 수신 한 대리인 콜백에 응답해야합니다.

당신은 편리하게 자신의 방법으로 호출이 시리즈를 패키지로 찾을 수 있습니다,하지만 당신은 확실히 조건이 변경되는 경우에만 전체 컨트롤러 객체를 재생 피할 수 있습니다.

+0

그래서 그냥 술어를 설정 한 다음 performFetch를 다시 호출하는 메서드를 만들겠습니까? – xonegirlz

+0

예, 충분합니다. – warrenm

+0

이 함수를 호출 한 후 술어가 설정되지 않은 fetchedObjects를 가져 오려면 어떻게해야합니까? 기본적으로 술어 (self.fetchedResultsController.fetchRequest setPredicate : nil)를이 항목 바로 뒤에 NSFetchRequest 바로 재설정해야합니다. – xonegirlz