Ios NSFetchedResultController不';当我更改FetchRequest而不更改NSSortDescriptor时,我不会更新UITableView
我的视图控制器中有一个UITableView和一个UISegmentControl。 视图控制器有两个段。当用户单击某个段时,我会在viewController中优化数据,它应该在UITableView中更新。这不管用 数据使用NSFetchedResultsController显示,其数据源是CoreData表。 它们使用相同的NSSortDescriptor,但不是相同的谓词 我观察到,当我更改NSSortDescriptor时,它是有效的,因此这个对象是问题的根源 当用户单击某个段时,我将此代码称为:Ios NSFetchedResultController不';当我更改FetchRequest而不更改NSSortDescriptor时,我不会更新UITableView,ios,iphone,objective-c,nsfetchedresultscontroller,Ios,Iphone,Objective C,Nsfetchedresultscontroller,我的视图控制器中有一个UITableView和一个UISegmentControl。 视图控制器有两个段。当用户单击某个段时,我会在viewController中优化数据,它应该在UITableView中更新。这不管用 数据使用NSFetchedResultsController显示,其数据源是CoreData表。 它们使用相同的NSSortDescriptor,但不是相同的谓词 我观察到,当我更改NSSortDescriptor时,它是有效的,因此这个对象是问题的根源 当用户单击某个段时,我将
self.fetchedResultsController = nil;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
并且它通过以下方式更新NSFetchedResultsController:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
//get the segment index:
NSUInteger selectedState = self.chooseTableSegmentedControl.selectedSegmentIndex;
//Update the fetched result consequently:
NSManagedObjectContext *context = self.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO];
NSPredicate *predicate;
if (selectedState == 0) {
[fetchRequest setSortDescriptors:@[dateDescriptor]];
} else if (selectedState == 1) {
predicate = [NSPredicate predicateWithFormat:
@"postedByUser == 0"];
[fetchRequest setSortDescriptors:@[dateDescriptor]];
}
[fetchRequest setPredicate:predicate];
[fetchRequest setFetchBatchSize:7];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"Root"];
_fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
有什么想法吗?非常感谢 创建新的“获取结果”控制器并调用
performFetch
后,必须使用reloadData
重新加载表视图<代码>性能蚀刻不会触发FRC委托方法
更新:当提取请求更改时,必须删除FRC缓存(使用
deleteCacheWithName:
)。但是缓存仅在与sectionNameKeyPath:
连接时有用,因此您也可以设置缓存名称:nil
来解决此问题。在创建新的获取结果控制器并调用performFetch
后,必须使用重新加载数据重新加载表视图<代码>性能蚀刻
不会触发FRC委托方法
更新:当提取请求更改时,必须删除FRC缓存(使用
deleteCacheWithName:
)。但是缓存仅在与sectionNameKeyPath:
连接时有用,因此您可以设置cacheName:nil
来解决此问题。实现委托方法,该方法将在tableview看到更改时重新加载tableview@insane-36:如果更改FRC并调用performFetch,则不会调用委托方法。在这种情况下,必须显式重新加载表视图。实现委托方法,该方法将在表视图看到更改时重新加载表视图@insane-36:如果更改FRC并调用performFetch,则不会调用委托方法。在这种情况下,您必须显式重新加载表视图。它仍然不能用于重新加载数据。实际上是在我的密码里我忘了过去。你还有别的主意吗?@Gabriel:试试cacheName:nil
。很好!插入[NSFetchedResultsController deleteCacheWithName:nil];在执行取回之前。谢谢你,马丁!你能编辑答案使其正确吗?它仍然不能重新加载数据。实际上是在我的密码里我忘了过去。你还有别的主意吗?@Gabriel:试试cacheName:nil
。很好!插入[NSFetchedResultsController deleteCacheWithName:nil];在执行取回之前。谢谢你,马丁!你能编辑答案使其正确吗?