如何在表视图中实现搜索(使用FRC)

时间:2012-09-23 18:47:33

标签: ios cocoa-touch uitableview uisearchdisplaycontroller

基础知识很简单:只需在表视图控制器中实现<UISearchBarDelegate,UISearchDisplayDelegate>即可。这是an adequate tutorial

诀窍是要意识到有两个控制器:一个表视图控制器和一个搜索显示控制器。每个控制器都有自己的表视图。因此,正在播放两个表视图:普通表视图和搜索显示表视图。当委托方法具有UITableView参数时,diff传入哪个表视图,并相应地执行不同的操作。

除了上述基础知识外,数据结构对我来说也是一个主要的挑战。更具体地说,如何过滤和存储搜索结果?我们有三种选择:

A。

  • 正常表格视图的一个FRC

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

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

  • 为FRC指定缓存以在内存中存储已提取的对象以提高性能

B。

  • 正常表格视图的一个FRC

  • 修改FRC的谓词以进行过滤。 Apple doc指示了3个步骤:

    1. 删除FRC缓存(最好不要首先使用一个)
    2. 更改谓词
    3. 调用performFetch

下进行。

两个FRC,每个表视图一个。在this popular post

的公认答案中提供了详细的实施

我认为A是正确的方法。我的理由包括:

A完成所有工作。并且它只需要对具有FRC属性的表视图控制器进行无关紧要的更改。更具体,只需在每个委托方法中的两个表视图之间进行区分,并添加NSArray属性来存储获取结果。当然,添加过滤代码。

B有一个潜在的缺点:FRC委托方法会混淆使用哪个获取请求?是搜索之前,搜索期间还是搜索之后?虽然可能有解决方案,但如果解决方案A正在运行,我认为不值得花时间。

第二个缺点是,如果我们希望搜索结果在运行中发生变化。搜索栏中的每个单字母用户类型都会导致FRC执行获取,这相当昂贵。

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

需要考虑的其他事项:

  • 在后台队列中进行过滤。因此,当用户在搜索栏中输入时,无论您的过滤有多昂贵,屏幕都不会被阻止。

  • 创建一个辅助方法,以在两个表视图之间进行区分。在相关的委托方法中调用辅助方法,这将使代码更清晰。

以上是我对表视图中的实现搜索的理解。如果有任何错误,请帮助指出。非常感谢。

1 个答案:

答案 0 :(得分:0)

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

如果出于某种原因需要执行[tableview reloadData],performFetch输出可以存储在缓存中并跳过提取;您当然可以编程以使tableview从多个来源获取其数据,但我认为没有任何理由这样做。如果多个源的唯一原因是在搜索之前跟踪结果,则应该有一种方法来重置谓词,以便FRC获取所有(当前)记录。对于我的应用程序,将所有或所有记录放在搜索栏中,会得到一个谓词1 = 1,它获取所有记录。同样,这可能与单个视图应用程序中的相关性不同,但是具有多个并发更新的选项卡式应用程序将需要这样来确保数据是最新的。