Iphone iOS筛选器NSFetchedResultsController高效

Iphone iOS筛选器NSFetchedResultsController高效,iphone,cocoa-touch,xcode,core-data,ipod-touch,Iphone,Cocoa Touch,Xcode,Core Data,Ipod Touch,我正在尝试将搜索支持添加到备份的UITableView核心数据中,并开始遇到一些性能问题。我目前与两个NSFetchedResultsController(一个用于常规,一个用于搜索)有关联。在我的uisearchdisplayedelegate方法中,我在每次调用后释放并重新创建我的NSFetchedResultsController。但是,这会导致键入时出现延迟!是否有更有效的方法过滤NSFetchedResultsController?我已经将批处理大小设置为大约50个项目,如果这有区别的

我正在尝试将搜索支持添加到备份的
UITableView
核心数据中,并开始遇到一些性能问题。我目前与两个
NSFetchedResultsController
(一个用于常规,一个用于搜索)有关联。在我的
uisearchdisplayedelegate
方法中,我在每次调用后释放并重新创建我的
NSFetchedResultsController
。但是,这会导致键入时出现延迟!是否有更有效的方法过滤
NSFetchedResultsController
?我已经将批处理大小设置为大约50个项目,如果这有区别的话,我的数据库有几千条记录。谢谢

这一点非常清楚:

  • 如果存在缓存,请将其删除
  • 更新
    fetchRequest
    属性。请注意,您不能简单地修改现有的获取请求;您必须创建一个新的
  • 调用
    -executeFetch:

我使用以下代码过滤FetchedResultController的结果

NSPredicate *pre = [NSPredicate predicateWithFormat:@"attribute CONTAINS [cd] %@", searchString];
NSArray *searchResults = [[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:pre]
希望有帮助

是的,您可以:

创建NSFetchRequest实例并每次更改其排序描述符:

 let shortDescriptor = NSSortDescriptor(key: key, ascending: ascending)
    request.sortDescriptors = [shortDescriptor]

    do {
        try fetchedResultViewController?.performFetch()
    } catch let error as NSError {
        print("Error in fetch \(error)")
    }

阅读苹果文档:

如果每次都发出执行fetch的新调用,那么这比重新创建
NSFetchedResultsController
更有效吗?至少,您不会每次都有创建和销毁
NSFetchedResultsController
的开销。所以,虽然我没有任何指标来衡量它的效率有多高,但它应该是。谢谢。我会尝试一下,但看起来我可能需要添加一些异步代码(并延迟提取)才能真正解决这个问题!当必须逐行更新
UITableView
时,不能使用此方法。