我正在使用coredata和fetchedResultsController
来填充tableView
,因为当我在搜索栏中放置文本需要4-5秒来显示对象时数据库非常大,所以我开始spinner
,然后在搜索结束时停止它。我使用委托方法willDisplayCell
,如下所示,但当搜索返回0对象时,spinner不会停止动画,因为willDisplayCell
未被触发:
- (BOOL)isFinishedLoadingTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath {
NSArray *visibleRows = [tableView indexPathsForVisibleRows]; // did verify sorted ascending via logging
NSIndexPath *lastVisibleCellIndexPath = [visibleRows lastObject];
// For tableviews with multiple sections this will be more complicated.
BOOL isPreviousCallForPreviousCell = self.previousDisplayedIndexPath.row + 1 == lastVisibleCellIndexPath.row;
BOOL isLastCell = [indexPath isEqual:lastVisibleCellIndexPath];
BOOL isFinishedLoadingTableView = isLastCell && ([tableView numberOfRowsInSection:0] == 1 || isPreviousCallForPreviousCell);
self.previousDisplayedIndexPath = indexPath;
return isFinishedLoadingTableView; }
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath
*)indexPath {
BOOL isFinishedLoadingTableView = [self isFinishedLoadingTableView:tableView indexPath:indexPath];
if (isFinishedLoadingTableView) {
[activityIndicatorView stopAnimating];
}
}
这里是FRC:
(NSFetchedResultsController *)fetchedResultsController{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CivicoEntity" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSMutableArray *finalSearchTextArray = [[NSMutableArray alloc]init];
NSArray *tempSearchTextItems = [self.searchText componentsSeparatedByString:@" "];
for (NSString *string in tempSearchTextItems){
if([string length]>0)
[finalSearchTextArray addObject:string];
}
if (self.searchText) {
NSMutableArray *predicatesArray = [[NSMutableArray alloc]init];
for (NSString *string in finalSearchTextArray) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"indirizzo CONTAINS[cd] %@ OR toponimo CONTAINS[cd] %@", string, string];
[predicatesArray addObject:predicate];
}
NSPredicate * finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicatesArray];
[fetchRequest setPredicate:finalPredicate];
}
NSSortDescriptor *sort_indirizzo = [[NSSortDescriptor alloc]
initWithKey:@"indirizzo" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSSortDescriptor *sort_civico = [[NSSortDescriptor alloc]
initWithKey:@"civico" ascending:YES selector:@selector(localizedStandardCompare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort_indirizzo, sort_civico, nil]];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context sectionNameKeyPath:nil
cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
答案 0 :(得分:0)
当willDisplayCell
必须显示至少一行/单元格时,将调用tableview
方法。这是你的情况,你需要找到一些其他解决方案来停止微调器动画。
尝试插入代码:
[activityIndicatorView stopAnimating];
方法中的:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
在里面,检查:
if (numberOfRows_to_return == 0) {
[activityIndicatorView stopAnimating];
}
答案 1 :(得分:0)
我打算评论但是没有足够的空间......
如果我的理解是正确的,你有很多选择。
您开发的机制有效,但还有一些其他方法可以考虑执行所需的操作。 (请原谅我,因为我不了解您对Objective-C的经验和技能水平。)
首先,我建议您阅读一些有关如何优化NSFetchedResultsController
(FRC)的内容。可能是因为如果在FRC中设置批量大小,数据将更快填充,并且不需要微调器。
我发现这两本书非常有用:来自实用书籍 - “核心数据,第2版,iOS,OS X和iCloud的数据存储和管理”(2013年1月),作者Marcus S. Zarra,以及来自Apress出版社 - 由Michael Privat和Robert Warner撰写的“Pro iOS Persistence Using Core Data”,请注意仍为alpha。
其次,如何过滤搜索数据非常重要。您可以在filter方法中包含一个完成块,该方法将在方法完成后停止动画。
因此,这真的是一个评论,但我没有房间,我会要求你提供更多的信息。特别是有关FRC和搜索机制的信息会有所帮助。