【问题标题】:How to implement search in a table view (with FRC)如何在表格视图中实现搜索(使用 FRC)
【发布时间】:2012-09-15 07:59:29
【问题描述】:

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

诀窍是要意识到有两个控制器:一个表格视图控制器和一个搜索显示控制器。每个控制器都有自己的表格视图。因此有两个表视图在起作用:普通表视图和搜索显示表视图。当委托方法有一个 UITableView 参数时,区分传入哪个表视图,并相应地做不同的事情。

除了上述基础之外,数据结构成为我的主要挑战。更具体地说,如何过滤和存储搜索结果?我们有三个选择:

答.

  • 普通表格视图的一个 FRC

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

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

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

B.

  • 一个用于普通表视图的 FRC

  • 修改 FRC 的谓词来做过滤。 Apple doc 指示执行此操作的 3 个步骤:

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

C.

两个 FRC,每个表视图一个。 this popular post接受的回答中提供了详细的实现方式


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

A 把所有的工作都做好了。它只需要对具有 FRC 属性的表视图控制器进行微不足道的更改。更具体地说,只是在每个委托方法中区分两个表视图,并添加一个 NSArray 属性来存储获取结果。当然,还要添加过滤代码。

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

第二个缺点是,如果我们想要动态改变搜索结果。用户在搜索栏中输入的每个字母都会导致 FRC 执行 Fetch,这是相当昂贵的。

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

其他需要考虑的事项:

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

  • 创建一个辅助方法来区分两个表视图。在相关委托方法中调用辅助方法,可以让代码更简洁。

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

【问题讨论】:

    标签: ios cocoa-touch uitableview uisearchdisplaycontroller


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多