如何在表格视图中实现search(使用FRC)

基础很简单:只需在你的表视图控制器中实现<UISearchBarDelegate,UISearchDisplayDelegate> 。 这里是一个足够的教程 。

诀窍是认识到有两个控制器:一个表视图控制器和一个search显示控制器。 每个控制器都有自己的表格视图。 因此两个表格视图正在播放:普通表格视图和search显示表格视图。 当委托方法有一个UITableView参数,比较哪个表视图被传入,并做相应的不同的事情。

除了基础之外,数据结构成为我面临的主要挑战。 更具体地说,如何筛选和存储search结果? 我们有三个select:

一个。

  • 一个正常的表格视图FRC

  • 创build一个数组属性来存储结果

  • 使用filteredArrayWithPredicate过滤获取的对象(数组)

  • 为FRC指定一个caching,以将获取的对象存储在内存中以提高性能

B.

  • 一个正常的表格视图FRC

  • 修改FRC的谓词来做filter。 苹果公司指示3个步骤来做到这一点:

    1. 删除FRCcaching(最好不要使用一个)
    2. 改变谓词
    3. 调用performFetch

C。

两个FRC,每个表视图一个。 这个热门文章的接受答案提供了详细的实现


我认为A是正确的路要走。 我的理由包括:

A做得很好。 而且它只需要对具有FRC属性的表格视图控制器进行无意义的更改。 更具体地说,只是在每个委托方法的两个表视图之间进行比较,并添加一个NSArray属性来存储提取结果。 当然,添加过滤代码。

B有一个潜在的缺点:FRC委托方法会被弄糊涂在哪个提取请求被使用? 是search之前,search期间还是search之后? 虽然在那里可能有解决scheme,但是我认为只要解决schemeA工作的时间不值得。

第二个缺点是,如果我们希望search结果在飞行中改变。 search栏中的每个单字母用户都会导致FRC执行提取,这相当昂贵。

C通过使用两个FRC来避免B的第一个缺点,但是由于完全相同的原因而遭受第二个缺点。

其他要考虑的事情:

  • 在后台队列中过滤。 所以当用户inputsearch栏时,不pipe你的filter花费多less,屏幕都不会被阻塞。

  • 创build一个辅助方法来区分两个表视图。 在相关的委托方法中调用helper方法,这会使代码更清晰。

以上是我对表格视图中工具search的理解。 如果有任何错误,请帮忙指出。 非常感谢。

我认为有一些有关UITableViews和FRC的概念错误。 FRC只是一个从Core Data获取数据的类,与MOC一起确保它保持数据完整性,即使您有几个同时访问同一数据库的选项卡,每个选项卡都会自行更新。 幕后有一些进程可以确保一个选项卡中的更新反映在所有其他选项卡中。 我实际上说的是如果绕过推荐的方法,会有后果。

performFetch输出可以存储在caching中,如果出于某种原因需要执行[tableview reloadData],则跳过读取。 你当然可以编程来让tableview从多个来源获取数据,但我没有看到这样做的任何理由。 如果多个源的唯一原因是在search之前跟踪结果,则应该有一种方法来重置谓词,以便FRC获取所有(当前)logging。 在我的应用程序的情况下,将全部或全部logging放在search栏中,结果是谓词1 = 1,它获取所有logging。 同样,这在单个视图应用程序中可能没有那么重要,但是具有大量并发更新的选项卡式应用程序将要求这样做,以确保数据是最新的。