2012-08-05 3 views
0

다음 코드는 tabbarcontroller의 두 번째 탭에 설정되어 있습니다. 탭에 처음 들어가면 데이터가 예상대로 올바르게 가져옵니다. 그러나 탭을 빠져 나와서 돌아 오면 array은 가져 오기 요청에 의해 반환 된 항목을 두 번 포함합니다. 반환하는 각 객체는 복제됩니다. 탭을 빠져 나와 다시 방문하면 항목이 다시 복제되어 각 항목이 3 개씩 표시됩니다. 이런 일이 일어나기를 바라는 나의 요청에 내가 뭘 잘못하고 있니?후속 실행시 중복 결과를 반환하는 FetchRequest

- (void)viewWillAppear:(BOOL)animated { 
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:delegate.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // sort the results, since we want the most recent entry first 
    NSSortDescriptor *dateSort = [[NSSortDescriptor alloc] initWithKey:@"key" ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:dateSort]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSError *error; 
    NSMutableArray *array = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 
    NSLog(@"error %@",[error localizedDescription]); 
    self.fetchedObjects = [array copy]; 
    [array removeAllObjects]; 

    [self.tableView reloadData]; 
} 

업데이트 : 내가 NSFetchedResultsController로 전환이 내 문제를 해결.

답변

0

NSFetchedResultsController로 전환하여 문제가 해결되었습니다.

0

실제 발생 이유를 즉시 보여주지는 않지만 실제 가져 오기 자체를 둘러싼 의심스러운 코딩은 대리인 메서드 나 컨트롤러의 다른 부분에 오류가있을 수 있음을 나타냅니다.

가져온 결과 컨트롤러를 사용하고 있습니까? 나중에 fetchObjects 컬렉션을 변경 하시겠습니까?

데이터베이스에 실제로 이러한 추가 개체가 모두 포함되어 있습니까? 아니면이 컨트롤러에있는 배열입니까?

또한 viewWillAppear에서 모든 작업을 수행하는 것이 좋지 않을 수 있습니다. 당신이 self.fetchedObjects = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

에 코드를 변경하려고하면 당신은 또한 우리에게 구현 UITableViewDataSource & UITableViewDelegate methods을 포함하여 더 많은 코드를 보여줄 수 무엇

+0

아니요, 가져온 결과 컨트롤러를 사용하고 있지 않습니다. 컬렉션을 변경하지 않고 테이블보기로 표시합니다. 데이터를 다른 탭에서 추가 할 수 있습니다. 따라서 viewWillAppear에서 다시 가져옵니다. 데이터베이스에는 추가 오브젝트가 포함되지 않고 후속 호출의 배열 만 포함됩니다. –

+0

이 컨트롤러의 모든 메서드에 중단 점을 놓고 배열의 개수가 어디인지 확인해야합니다. setFetchedAttributes의 사용자 정의 구현이 있습니까? –

+0

페치가 실행되면 카운트가 두 배가됩니다. 가져 오기 전후에 배열을 검사하면 중복 된 항목을 볼 수 있습니다. 첫 번째 실행에서 올바른 금액을 반환합니다. 아니요, 맞춤 구현이 없습니다. –

관련 문제