gpt4 book ai didi

ios - UISearchDisplayController、UITableView 和核心数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:28 26 4
gpt4 key购买 nike

我是 iOS 编程的新手。我已经使用 NSFetchedResultsController 实现了一个由 CoreData 填充的 UITableView。这部分效果很好。然后我添加了一个 UISearchDisplayController 以便能够搜索表格。搜索本身工作正常,但似乎在我重新加载 View 时泄漏了我的 CoreData 对象。应用程序没有崩溃,但每次我执行搜索或关闭 SearchView 时,Instrument 报告对象在 CoreData 框架中泄漏。

我已经实现了这样的搜索功能:

- (void)filterContentForSearchText:(NSString*)searchText
scope:(NSString*)scope
{
if (searchText && searchText.length) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@", searchText];
[self.fetchedResultsController.fetchRequest setPredicate:predicate];
}

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}

}

当我关闭 SearchBar 时:

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
NSLog(@"searchBarTextDidEndEditing: Reset fetchedResultsController predicate" );
self.fetchedResultsController.fetchRequest.predicate = nil;
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@",error,[error userInfo]);
abort();
}
}

谁能看出我做错了什么?

谢谢凸轮

更新:我关注了这篇文章 How to filter NSFetchedResultsController (CoreData) with UISearchDisplayController/UISearchBar并以相同的方式实现了 getter,但是当我在搜索栏中“键入”一些字母时,我仍然在泄漏核心数据对象,所以问题似乎出在我获取新数据而不是关闭 View 时。

代码如下:

1) 当我在搜索栏中输入时,我将 self.searchBarFetchedResultsController 设置为 nil

(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
self.searchBarFetchedResultsController.delegate = nil;
self.searchBarFetchedResultsController = nil;
}

2) 当再次调用 getter 时,我按照示例分配了一个新的 FRC。

- (NSFetchedResultsController *)searchBarFetchedResultsController
{
if (_searchBarFetchedResultsController != nil)
{
return _searchBarFetchedResultsController;
}
_searchBarFetchedResultsController = [self newFetchedResultsControllerWithSearch:self.searchDisplayController.searchBar.text];
return _searchBarFetchedResultsController;
}


- (NSFetchedResultsController *)newFetchedResultsControllerWithSearch:(NSString *)searchString
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Beers"];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@", searchString];
if(searchString.length)
{
[request setPredicate:predicate];
}
[request setFetchBatchSize:20];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.beerDB2.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error])
}
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

return aFetchedResultsController;
}

然后,当我从委托(delegate)方法访问 FRC 时,我使用此方法来获取正确的方法。

- (NSFetchedResultsController *)fetchedResultsControllerForTableView:(UITableView *)tableView
{

return tableView == self.favTab ? self.fetchedResultsController : self.searchBarFetchedResultsController;

}

除了 Inspector 告诉我我正在泄漏数百个核心数据对象之外,一切都完美无缺 :( 让我发疯的是,我并非一直都在泄漏它们。对于某些搜索来说,它可以正常工作,然后它就会开始泄漏。届时,任何后续搜索都将触发泄漏。

最佳答案

在“viewdidload”上,获取全局声明数组中的所有详细信息...并在搜索函数中,使用“NSPredicate”过滤数组

关于ios - UISearchDisplayController、UITableView 和核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com