使iOS应用程序的搜索操作简单高效

在本文中,我想分享如何将搜索功能添加到列出大量数据的ViewController中。

对于iOS应用程序,我们正在开发许多页面以显示数据列表,并且我们添加了搜索功能以使查找所需内容变得容易。

为了简化这些步骤,我在一个经理类中合并了一些功能和操作。

  • filter :可以随时调用以启动过滤器操作的主要功能。 (例如:用户输入关键字进行搜索时)
  • searchCompleted:完成处理程序,在过滤器操作完成时调用,并返回过滤后的列表。
  • 首先,您的数据模型必须支持可搜索协议才能使其可搜索。
  //项应符合可过滤性的协议。 
协议可搜索{
func getSearchText()->字符串
}

使用此委托函数,您应该返回将在其中搜索给定关键字的字段。 例如,如果您的模型包含要搜索的namecuntryemail字段,则委托函数应如下所示:

  //栏位 
var名称:字符串
var country:字符串
var email:字符串
//委托函数
功能
getSearchText ()->字符串{
返回
姓名 +“ @” + 国家 +“ @” + 电子邮件 }

你应该

使用 BlockOperation OperationQueue

  • 创建一个BlockOperation实例,并将主过滤器操作添加到执行块中。
  var filterOperation = BlockOperation ()filterOperation。  addExecutionBlock ({// 筛选操作 ... 
}
self.filterOperation。 completeBlock = {

//返回过滤列表。
...
}
  • 创建一个OperationQueue实例,并添加filterOperation以开始执行。
  var filterQueue = OperationQueue () 
filterQueue.addOperation(
filterOperation

虽然新操作将被添加到OperationQueue,但当前正在运行的操作将被取消(如果存在)。

缓存以前的搜索结果

为了更快地执行过滤操作,以前的结果将存储在字典中。

  • allList:整个数据列表(可搜索的类型)。
  • cachedResults :用于保存先前搜索结果的字典。

例如,考虑一个场景;

第一:用户搜索关键字:“ h

  //通过关键字“ h”过滤allList 

filterResult = allList.filter(“ h”)//将搜索结果作为关键字将过滤结果保存在字典中
cachedResults [“ h”] = filterResult

第二:用户搜索关键字:“

allList中开始使用“ he ”关键字进行过滤之前请检查之前是否已缓存指定的关键字(或最相关的关键字)。 对于此示例,将使用键“ h”的缓存结果,而不是在allList中进行搜索。

下一步,如果将搜索“ hel”关键字,则将缓存列表用作“ he”关键字会更好。 所有这些操作都是由该管理员执行的。

使用dataList参数创建FilterOperationManager类的实例,该实例呈现要列出的所有项目。

 让filterManager = FilterOperationManager (allItems:dataList) 

实现searchCompleted处理程序。

  filterManager。  searchCompleted = {[弱自我] filteredList在 
//对过滤列表执行任何操作。
}

随时调用过滤器功能。

  filterManager。  过滤器 (关键字) 

就这样。 在您调用的过滤器操作完成之后,filteredList将与searchCompleted处理程序一起返回。

您可以在这里找到这位经理

在此处下载示例项目。

谢谢。

如果您觉得本文有用,请点击下面的“拍手”按钮 👏