Ios NSFetchedResultsController未触发controllerDidChangeContent
我当前的设置: 我打算使用UISegmentedControl在我想在tableview中显示的数据之间切换。 我一直在使用restkit与Web服务进行所有restful交互。数据存储在coredata sqlite存储中。我已按以下方式设置了NSFetchedResultsControllerIos NSFetchedResultsController未触发controllerDidChangeContent,ios,core-data,restkit,Ios,Core Data,Restkit,我当前的设置: 我打算使用UISegmentedControl在我想在tableview中显示的数据之间切换。 我一直在使用restkit与Web服务进行所有restful交互。数据存储在coredata sqlite存储中。我已按以下方式设置了NSFetchedResultsController -(void)setupFetchedResultsControllerWithFetchRequest:(NSFetchRequest *)fetchRequest{ self.fetch
-(void)setupFetchedResultsControllerWithFetchRequest:(NSFetchRequest *)fetchRequest{
self.fetchedResultsController=nil;
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"address" ascending:YES];
fetchRequest.sortDescriptors = @[descriptor];
NSError *error = nil;
// Setup fetched results
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
[self.fetchedResultsController setDelegate:self];
BOOL fetchSuccessful = [self.fetchedResultsController performFetch:&error];
// NSAssert([[self.fetchedResultsController fetchedObjects] count], @"Seeding didn't work...");
if (! fetchSuccessful) {
ShowAlertWithError(error);
}
}
这就是我编写fetch请求以传递到fetchedresultscontroller的方式
-(NSFetchRequest *)prepareFetchRequestForGlobalAtm{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"AtmBranches"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"branchType='0'"];
[fetchRequest setPredicate:predicate];
return fetchRequest;
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.locationsTableView reloadData];
}
我已经在分段控制切换方法中将它们适当地匹配在一起
[self setupFetchedResultsControllerWithFetchRequest:[self prepareFetchRequestForGlobalAtm]];
//Restkit Call
[self loadGlobalAtms];
这是我对NSFetchedResultsController的委托方法
-(NSFetchRequest *)prepareFetchRequestForGlobalAtm{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"AtmBranches"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"branchType='0'"];
[fetchRequest setPredicate:predicate];
return fetchRequest;
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.locationsTableView reloadData];
}
我的逻辑是,每个切换都应该根据传递的值触发方法来设置NSFetchedResultsController。我可以在日志中清楚地看到,我有来自Web服务的值,这些值正在被缓存,但tableview从不填充自身。您没有更改数据,因此无法接收通知 使用self.fetchedResultsController执行蚀刻时,您已经获得了所有对象 在mainManagedObjectContext或其子ManagedObjectContext中插入/更新/删除时,可以接收代理的回调 你应该这样做
[self.fetchedResultsController setDelegate:self];
BOOL fetchSuccessful = [self.fetchedResultsController performFetch:&error];
// NSAssert([[self.fetchedResultsController fetchedObjects] count], @"Seeding didn't work...");
if (! fetchSuccessful) {
ShowAlertWithError(error);
}
[self.locationsTableView reloadData];
调用[self-loadGlobalAtms]后,如果要重新加载数据,请保留委托回调时的逻辑;您是否使用managedObjectContextyes存储数据?当然有。我可以使用sqlite浏览器工具查看sqlitedb中的对象。当您更改UISegmentedControl的值时,您将从本地核心数据加载数据,在performFetch之后,managedObjectContext中是否有任何对象?我想你的谓词可能有问题。我也遇到过同样的问题,它也是谓词。非常感谢!