2010-12-12 7 views
1

내 iPhone (4.1.2) 앱에 하위 메뉴가 각각 NSManagedObject 개의 하위 클래스로 채워진 다른 테이블보기로 연결되는 메뉴가 있습니다. 각각에 대해 동일한보기 컨트롤러를 사용하지만 가져 오기 요청의 조건부가 다른 점은 사용자가 선택한 메뉴 항목에 따라 다른 데이터가 표시된다는 것입니다. 충분히 간단합니다.이상한 핵심 데이터 버그

실제로 관리되는 개체 컨텍스트를 저장하기 전에 모든 것이 잘 작동합니다. 앱이 배경을 입력하고 전경을 다시 들어간다 후에 내가 이것을 사용하고 있기 때문에, 가지, 이상한 이동 :

- (void)applicationDidEnterBackground:(UIApplication*)application { 
    NSError *error = nil; 
    if(managedObjectContext != nil) 
     if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
} 

나는이 내 데이터를 저장하기위한 적절한 시간이 될 것입니다 생각. 그러나이 문제가 발생한 후, 내가 가져온 결과 컨트롤러에서 performFetch:을 호출하면 그 fetchedObjects은 이전의 인출 요청에서 페치 된 개체이며 새 것이 아닙니다. 내가 할 경우 즉, :

// Choose menu item 1 

[self.fetchedResultsController performFetch:nil]; // With fetch request 1 
NSLog(@"%i objects were fetched", [[self.fetchedResultsController fetchedObjects] count]); // Items for fetch request 1 

// Go back to menu, choose menu item 2 for new fetch request 

[self.fetchedResultsController performFetch:nil]; // Fetch request 2 
NSLog(@"%i objects were fetched", [[self.fetchedResultsController fetchedObjects] count]); // Items for Fetch request 2 

// Hit home button, applicationDidEnterBackground: is called 
// Relaunch 
// Choose menu item 1 

[self.fetchedResultsController performFetch:nil]; // With fetch request 1 
NSLog(@"%i objects were fetched", [[self.fetchedResultsController fetchedObjects] count]); // Items for fetch request 2 - HUH? 

그래서 문제는 내 관리되는 개체 컨텍스트에 save:를 호출하여입니다. 데이터를 저장하지 않으면 페치 요청이 이렇게 섞일 수는 없지만 한번만 수행하면 fetchedResultsController 자체가 내보기 컨트롤러의 viewDidLoad 메서드에서만 생성 되더라도 이전 페치 요청이 저장되는 것과 같습니다.

누구나 무슨 일이 벌어지고 있는지 알 수 있습니까?

업데이트 : 추가 코드. 당신이 경우

- (void)viewDidLoad { 
    delegate = (MAAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    managedObjectContext = delegate.managedObjectContext; 

    [self.fetchedResultsController performFetch:nil]; 
    NSUInteger count = [[self.fetchedResultsController fetchedObjects] count]; // Bug is detected here 

    // ... 
} 

- (NSFetchedResultsController *)fetchedResultsController { 
    if(_fetchedResultsController) 
     return _fetchedResultsController; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:managedObjectContext]; 
    NSPredicate *predicate = nil; 
    if([self.navigationItem.title isEqualToString:@"Personal"]) 
     predicate = [NSPredicate predicateWithFormat:@"account.username = %@ AND user.username = %@", delegate.currentAccount.username, delegate.currentAccount.username]; 
    else if([self.navigationItem.title isEqualToString:@"Favorites"]) 
     predicate = [NSPredicate predicateWithFormat:@"account.username = %@ AND favorited = YES", delegate.currentAccount.username]; 
    else 
     predicate = [NSPredicate predicateWithFormat:@"account.username = %@", delegate.currentAccount.username]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:20]; 
    [fetchRequest setPredicate:predicate]; 

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

    [fetchRequest setSortDescriptors:sortDescriptors]; 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                           managedObjectContext:managedObjectContext 
                            sectionNameKeyPath:@"retrieved" 
                              cacheName:@"Root"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 

    return _fetchedResultsController; 
} 
+0

거의 확실하게 문제는 applicationDidEnterBackground : 메소드에 Managed Object Context를 저장하는 데 있지 않습니다. viewDidLoad 및 fetchedResultsController 메소드의 코드를 게시하십시오. –

+0

원래 게시물이 업데이트되었습니다. –

답변

1

당신은 당신이 각 캐시에 대해 다른 이름을 사용하고, 각 하위 뷰에서 캐싱 및 있는가?

+0

무엇을 캐싱하고 있습니까? fetchedResults –

+0

관련 코드는'cacheName : @ "Root"];'각 FRC는 캐시 이름을 가질 수 있습니다 ... 이름을 공유하면 이상한 일이 발생할 수 있습니다 – griotspeak

1

이 추가 코드를 보지 않고 말할 어렵지만 발생한 문제는 fetchedResultsController 방법에 초기 라인에 아마도 때문이다 :

if(_fetchedResultsController) 
     return _fetchedResultsController; 

은 무엇 일어나고있는 것은 즉 - 그냥 추측 - 당신이 이전 _fetchedResultsController를 재사용하는

[self.fetchedResultsController performFetch:nil]; 

가 Y로 새로운 NSFetchedResultsController 인스턴스화되지 않은 사용자의 viewDidLoad 방법에 선입니다 요청 2.를 가져 오기위한 조건을 사용하고 설정을 가지고 생각해 보면 : 앞의 두 행 때문에 fetchedResultsController을 호출하면 이전의 값이 즉시 반환됩니다.