使iOS应用程序的搜索操作简单高效
在本文中,我想分享如何将搜索功能添加到列出大量数据的ViewController中。
对于iOS应用程序,我们正在开发许多页面以显示数据列表,并且我们添加了搜索功能以使查找所需内容变得容易。
为了简化这些步骤,我在一个经理类中合并了一些功能和操作。
- filter :可以随时调用以启动过滤器操作的主要功能。 (例如:用户输入关键字进行搜索时)
- searchCompleted:完成处理程序,在过滤器操作完成时调用,并返回过滤后的列表。
- 首先,您的数据模型必须支持可搜索协议才能使其可搜索。
//项应符合可过滤性的协议。
协议可搜索{
func getSearchText()->字符串
}
使用此委托函数,您应该返回将在其中搜索给定关键字的字段。 例如,如果您的模型包含要搜索的name , cuntry和email字段,则委托函数应如下所示:
//栏位
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处理程序一起返回。
您可以在这里找到这位经理。
在此处下载示例项目。
谢谢。
如果您觉得本文有用,请点击下面的“拍手”按钮 👏