내 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;
}
거의 확실하게 문제는 applicationDidEnterBackground : 메소드에 Managed Object Context를 저장하는 데 있지 않습니다. viewDidLoad 및 fetchedResultsController 메소드의 코드를 게시하십시오. –
원래 게시물이 업데이트되었습니다. –