NSFetchedResultsController 对谓词更改的委托方法调用
Posted
技术标签:
【中文标题】NSFetchedResultsController 对谓词更改的委托方法调用【英文标题】:NSFetchedResultsController delegate method calls on predicate change 【发布时间】:2013-10-10 13:01:06 【问题描述】:我有一个简单的应用程序,其中的国家/地区拥有城市,而城市又拥有人。我想在表格视图中显示国家/地区列表。我使用 NSFetchedResultsController 来获取所有数据。这是设置:
-(void)initializeFetchedResultsController
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Country"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
fetchRequest.fetchBatchSize = 30;
self.fetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[NSManagedObjectContext managedObjectContext]
sectionNameKeyPath:@"nameFirstLetter"
cacheName:nil];
self.fetchResultsController.delegate = self;
[self.fetchResultsController performFetch:nil];
我还添加了通过在搜索栏中输入国家名称进行搜索的功能,因此我实现了 UISearchBarDelegate 方法:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
if([searchText isEqualToString:@""])
self.fetchResultsController.fetchRequest.predicate = nil;
else
self.fetchResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchText];
[self.fetchResultsController performFetch:nil];
[self.tableView reloadData];
这可行,但不是我想要的方式。我希望在谓词更改时,我的 NSFetchResultsControllerDelegate 委托方法将再次被调用,这样我就可以从我的表格视图(我想要动画)中插入或删除项目/部分,而无需弄清楚自己添加和删除了什么。但事实并非如此,相反,如果我更改谓词,则不会调用委托方法,我必须做一个简单的 [self.tableView reloadData]。是我做错了什么,还是它应该按照它应该的方式工作,我不能走这条捷径?
【问题讨论】:
比较 ***.com/questions/14797224/… 以获得类似的问题和一些想法。 【参考方案1】:你没有做错。事情就是这样,没有捷径可走。您必须实现自己的代码才能在两次提取之间为表格视图设置动画。
【讨论】:
【参考方案2】:正如@StianHøiland 所说,您需要自己动手。通常使用委托方法,它们会因“离线”/异步更改而被调用,以通知您。它们不会因为您明确请求的更改而被调用。
您可以考虑使用 FRC 的 fetchedObjects
和 indexPathForObject:
功能。过滤fetchedObjects
列表(使用您的谓词)。获取已删除对象的索引路径,您可以将它们制作成动画。
【讨论】:
以上是关于NSFetchedResultsController 对谓词更改的委托方法调用的主要内容,如果未能解决你的问题,请参考以下文章