具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”和 “包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在此本发明说明书中所使用的术语仅仅是出于描述特定实施例的目的而并不意在限制本发明。如在本发明说明书和所附权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。
还应当进一步理解,在本发明说明书和所附权利要求书中使用的术语“和/ 或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
下面请参见图1,图1为本发明实施例提供的一种文件扫描方法的流程示意图,具体包括:步骤S101~S105。
S101、通过代码构建工具创建数据管理结构和数据模型;其中,所述数据管理结构包括数据管理类、文件扫描管理类和数据筛选管理类,所述数据管理类包含有变量DataManager allFileItems,所述文件扫描管理类包含有变量fileQueue,所述数据筛选管理类包含有变量filterType;所述数据模型包括文件夹节点数据模型和文件根节点数据模型,所述文件根节点数据模型中包含有变量totalFilterFileItems;
S102、创建rootNodeDic字典,遍历文件扫描管理类单次抛出的json文件数据,以获取所述json文件数据的NodeType类型,并将NodeType类型对应的RootNode对象保存至rootNodeDic字典中;
S103、遍历获取所述rootNodeDic字典中的RootNode对象,根据遍历获取结果生成FileItem对象,并保存至变量DataManager allFileItems中;
S104、将FileItem对象同步传递至文件根节点数据模型,并由文件根节点数据模型进行筛选类型组装;
S105、响应于用户的搜索请求,基于所述搜索请求对变量DataManagerallFileItems进行遍历,得到对应的搜索结果;和/或,响应于用户的扫描请求,基于所述扫描请求对变量totalFilterFileItems进行遍历,得到对应的扫描结果。
本实施例中,首先通过代码构建工具(例如Xcode)创建数据模型和数据管理结构,所述的数据模型具体包括多种不同模型,例如文件夹节点数据模型和文件根节点数据模型,所述数据管理结构具体包括多种不同类,例如数据管理类、文件扫描管理类和数据筛选管理类。基于各数据模型和数据管理结构,遍历单次抛出的json文件数据,并将该json文件数据对应的RootNode对象存储至创建的rootNodeDic字典中。然后对rootNodeDic字典进行遍历,以生成FileItem对象并保存至DataManager allFileItems中,从而实现树状节点组装。同时将FileItem对象同步传递至文件根节点数据模型,以实现筛选类型组装。当接收到用户的搜索请求或者扫描请求时,对对应的变量DataManager allFileItems和totalFilterFileItems进行遍历,从而得到相应的搜索结果和扫描结果。
本实施例通过良好的数据模型搭建,和对数据管理类的划分,充分体现单一职责原则,在降低数据组装时间复杂度的同时,可以支持在对当前扫描过程中,建立树状节点和快速响应用户的操作需求能够同时进行,并支持实时显示用户的搜索和筛选操作,从而达到对于文件树状节点的搜索和筛选的效果,提高文件扫描适用性。
在一具体实施例中,结合图3所示,(1)使用Xcode创建文件节点数据模型FileItem,该模型包含以下数据:
FileNodeparentNode,其中,“/>”表示的是指针变量,parentNode是这个变量的名称,这个变量是FileNode类型数据,FileNode/>parentNode用于保存该文件属于哪个文件夹节点;
long nodeSize,用于保存文件大小,其中,long是一个64位整型数据;
double modifyTime,用于文件修改的时间戳;
NodeType nodeType,用于确认文件的类型;
NSStringnodeName,其中,“/>“表示指针变量,nodeName是这个变量的名称,这个变量是NSString类型,NSString表示一个静态的纯文本Unicode字符串,NSString/>nodeName中包含有文件的路径信息。
(2)使用Xcode创建文件夹节点数据模型FileNode,该模型包含以下数据:
NSMutableArrayfileChildrenNodes,其中,“/>”表示指针变量,fileChildrenNodes是变量名称,该变量是NSMutableArray类型,NSMutableArray表示大小可以改变的数组,其存放的是FileItem模型数据,NSMutableArray/>fileChildrenNodes用于存储文件节点数据;
NSMutableArrayfolderChildrenNodes,其中,“/>”表示指针变量,folderChildrenNodes是变量名称,该变量是NSMutableArray类型,NSMutableArray表示大小可以改变的数组,其存放的是FileNode模型数据,NSMutableArray/>folderChildrenNodes用于存储文件夹节点数据;
FileNodeparentNode,其中,“/>”表示的是指针变量,parentNode是这个变量的名称,该变量是FileNode类型的数据,FileNode />parentNode用于指向父节点。
(3)使用Xcode创建文件根节点数据模型DiskPartition,继承之FileNode,该模型新增包含以下数据:
NSMutableSetassembleFilterSet,其中,“/>”表示的是指针变量,assembleFilterSet是变量名称,该变量是NSMutableSet类型,NSMutableSet表示大小可变的集合,存放的是FileItem模型的数据,该数据集合不能包含相同的数据,NSMutableSet/>assembleFilterSet用于存储扫描过程中筛选之后的等待组装的数据;
NSMutableArraytotalFilterFileItems,其中,“/>”表示指针变量,totalFilterItems是变量名称,该变量是NSMutableArray类型,NSMutableArray表示大小可以改变的数组,存放的是FileItem模型数据,NSMutableArray/>totalFilterFileItems用于保存筛选的所有文件对象;
结合图4,FileItem、FileNode、DiskPartition经过组装之后,会生成如图4所示树状节点关系。可以理解的是,这里仅是举例,在实际情况中,真实树状节点的规格要更大。
(4)使用Xcode创建节点数据模型RootNode,该模型包含以下数据:
NSMutableDictionarysamePathNode,其中,“/>”表示指针变量,samePathNode是变量名称,该变量是NSMutableDictionary类型,NSMutableDictionary表示大小可以改变的字典,字典代表的是键值:key-value数据集合,NSMutableDictionary/>samePathNode用于存储单次抛出数据中相同路径的文件信息。
(5)使用Xcode创建文件扫描管理类DiskEntityManager,负责磁盘文件数据扫描,包含以下变量:
NSOperationQueuefileQueue,其中,“/>”表示指针变量,fileQueue是变量名称,该变量是NSOperationQueue类型,NSOperationQueue是操作队列,其可以窜行执行指定的代码,NSOperationQueue/>fileQueue用于异步构造树状节点,
BOOL isAssembling,其中,BOOL表示的是布尔变量,该变量只有两种值:真和假,isAssembling是变量名称,BOOL isAssembling用于标识fileQueue是否正在组装节点。
(6)使用Xcode创建数据管理类DataManager,用于保存数据节点和扫描过程中的节点,包含以下数据:
DiskPartitiontreeRootNode,其中,“/>”表示指针变量,treeRootNode是变量名称,该变量是DiskPartition类型,DiskPartition/>treeRootNode作为磁盘文件目录的根节点;
NSMutableDictionarytreeNodeCache,其中,“/>”表示指针变量,treeNodeCache是变量名称,该变量是NSMutableDictionary类型,NSMutableDictionary表示大小可以改变的字典,字典代表的是键值:key-value数据集合,NSMutableDictionary/>treeNodeCache用于缓存扫描过程中所有的文件夹节点FileNode对象;
NSMutableSetallFileItems,其中,“/>”表示的是指针变量,allFileItems是变量名称,这个变量是NSMutableSet类型,NSMutableSet表示大小可变的集合,存放的是FileItem模型的数据,该数据集合不能包含相同的数据,NSMutableDictionary/>treeNodeCache用于缓存所有的文件信息;
NSStringsearchKeyWord,其中,“/>”表示指针变量,searchKeyWord是变量名称,这个变量是NSString类型,NSString表示一个静态的纯文本Unicode字符串,NSString/>searchKeyWord用于保存用户界面输入的搜索关键字;
NSMutableSetsearchItems,其中,“/>“表示指针变量,searchItems是变量名称,这个变量是NSMutableSet类型,NSMutableSet表示大小可变的集合,存放的是FileItem模型的数据,该数据集合不能包含相同的数据,NSMutableSet/>searchItems用于保存搜索到的文件对象FileItem;
NSMutableArraysearchFilterItems,其中,“/>”表示指针变量,searchFilterItems是变量名称,这个变量是NSMutableArray类型,NSMutableArray表示的是大小可以改变的数组,存放的是FileItem模型数据,NSMutableArray/>searchFilterItems用于保存搜索基础上的筛选数据。
(7)使用Xcode创建数据筛选管理类FilterManager,负责文件类型筛选相关数据处理,提供按文件大小、文件创建时间、文件标签类型进行筛选。包含以下数据:
FilterType filterType,其中,filterType为变量名称,FilterType是自定义的筛选枚举类型,FilterType filterType表示筛选的文件类型,
DiskPartitioncurrentFilterNode,其中,“/>“表示指针变量,currentFilterNode是变量名称,DiskPartition/>currentFilterNode表示当前筛选的文件的根节点。
在一实施例中,所述步骤S102包括:
设置文件扫描管理类的变量isAssembling为真,遍历获取文件扫描管理类单次抛出的json文件数据,并判断变量fileQueue是否暂停;
若判定变量fileQueue暂停,则将操作代码块添加到变量fileQueue的队列中等待执行;
若判定变量fileQueue未暂停,则创建用于保存RootNode对象的rootNodeDic字典;
遍历json文件数据以获取对应的文件信息,并根据所述文件信息确认json文件数据的NodeType类型;
判断rootNodeDic字典是否存在对应类型的RootNode对象;
若未存在对应类型的RootNode对象,则在rootNodeDic字典创建所述RootNode对象并保存,然后将文件信息保存到RootNode对象的samePathNode数组中。
结合图5,本实施例通过对单次数据进行哈希归类,来减少在数据组装过程时,文件查找所在文件夹节点的次数。具体来说,首先设置DiskEntityManager isAssembling为true,其表示文件扫描管理类DiskEntityManager正在组装处理数据。接着遍历获取DiskEntityManager单次抛出的json文件数据,并判断fileQueue是否暂停。在这里,json文件数据会被fileQueue的代码块捕获,而fileQueue作为一个队列,会捕获多个json文件数据并进行串行处理,也就是说,后续捕获的数据需要等待当前正在处理的数据执行完毕后才会进行处理。如果fileQueue暂停,则将操作block代码块添加到fileQueue队列中等待执行,block代码块是Objective-C编程语言的一种编码方式,block代码块能够捕获代码上下文的变量,这样做的好处是:即使当前函数执行完毕后,变量由于已经被捕获,因此并不会被销毁。如果fileQueue没有暂停,则直接执行数据处理。即创建一个名为rootNodeDic的字典,用于保存RootNode对象,然后遍历json数据获取单个文件信息,并确认这个文件信息属于哪种NodeType类型,例如可以根据字段type、is_exist、is_lost_location以及name判断NodeType类型,从而确认rootNodeDic是否存在此类型的RootNode对象,不存在则创建并保存,然后将文件信息保存到RootNode对象samePathNode数组中。
在一实施例中,所述步骤S103包括:
遍历rootNodeDic字典以获取其中所有的RootNode对象;
遍历所有的RootNode对应的samePathNode属性,以获取所有的文件信息;
根据文件信息中的文件路径判断数据管理类的treeNodeCache是否存在对应的文件夹缓存FileNode;
如果判定存在对应的文件夹缓存FileNode,则将每个文件信息生成FileItem对象,并保存至缓存FileNode的fileChildrenNodes属性和DataManager allFileItems中;
如果判定未存在对应的文件夹缓存FileNode,则根据文件信息中的文件路径顺序,查找最后一个缓存的文件夹节点,并依据剩余未创建的路径节点依次创建FileNode对象,然后保存至上一路径节点的FileNode属性folderChildrenNodes中;
当保存到最后一个FileNode时,将所有的文件信息生成FileItem对象,并保存至最后一个FileNode的fileChildrenNodes属性和DataManager allFileItems中。
本实施例中,数据管理类DataManager对rootNodeDic进行进一步处理,以进行树状节点组装。具体来说,结合图6,首先遍历rootNodeDic来获取其中所有的RootNode对象,再遍历RootNode的samePathNode属性,来获取所有的文件信息,然后根据文件路径判断DataManager的treeNodeCache是否存在对应的文件夹缓存FileNode。如果缓存存在,则将每个文件信息生成FileItem对象,并保存到缓存FileNode的fileChildrenNodes属性和DataManager allFileItems中。如果缓存不存在,则根据文件路径从尾到头的顺序,查找最后一个缓存的文件夹节点,再依据剩余未创建的路径节点依次创建FileNode对象,并保存到上一个路径节点的FileNode属性folderChildrenNodes中,当保存到最后一个FileNode时,将所有的文件信息生成FileItem对象,然后保存到最后一个FileNode的fileChildrenNodes属性和DataManager allFileItems中。
在一实施例中,所述步骤S104包括:
将FileItem对象同步传递至文件根节点数据模型,并由所述文件根节点数据模型根据FileItem对象的对象信息存储到对应的集合当中;
判断数据筛选管理类的变量filterType是否为空,并当变量filterType不为空时将FileItem对象至添加到数据筛选管理类的属性currentFilterNode的assembleFilterSet属性中,并等待所有的数据处理完毕后组装;
判断数据管理类的变量searchKeyWord是否为空,并当变量searchKeyWord不为空时将FileItem对象添加至数据管理类的属性searchFilterItems中。
在添加FileItem的同时,本实施例还将FileItem同步传递给根节点(Diskpartition类)进行筛选类型组装。具体来说,结合图7,根节点根据FileItem的大小nodeSize、修改时间modifyTime、标签nodeType等信息,存储到对应的集合当中。在这里,如果FilterManager属性filterType不为空,则判断FileItem是否符合当前的筛选规则,然后添加到FilterManager的属性currentFilterNode 的assembleFilterSet属性中,并等待所有的数据处理完毕后组装。进一步的,如果DataManager searchKeyWord不为空,则判断FileItem是否符合当前的筛选规则且包含搜索关键字,并在符合当前的筛选规则且包含搜索关键字的情况下添加到DataManager属性searchFilterItems中。
此外,还会判断DataManager searchKeyWord是否为空,如果不为空,则进一步判断上述的文件对象FileItem的文件名nodeName是否包含搜索关键字,如果包含则添加到DataManager searchItems中。然后重置变量isAssembling,并设置DiskEntityManagerisAssembling为false,表示单次节点组装完毕。
在一实施例中,所述步骤S105包括:
基于所述搜索请求提取搜索关键字;
遍历变量DataManager allFileItems,以获取包含有搜索关键字的搜索FileItem对象;
将所述搜索FileItem对象添加至变量searchItems中,并将变量searchItems作为搜索数据源进行界面更新。
本实施例中,当用户在操作界面输入搜索关键字时会触发扫描过程中搜索功能。即遍历DataManager allFileItems,找出所有文件名称包含搜索关键字的FileItem对象,然后添加到searchItems中。当下一次扫描数据继续抛出时,执行“添加到搜索”这一步,此时界面组件将searchItems作为数据源,并进行界面更新。
在一实施例中,所述步骤S105还包括:
基于所述扫描请求提取筛选条件,并根据所述筛选条件对数据管理类的treeRootNode对象进行筛选,得到筛选结果,并将所述筛选结果保存至变量totalFilterFileItem;
利用变量treeRootNode生成关于所述筛选结果的副本,并将所述副本赋值于数据筛选管理类的变量currentFilterNode中;
遍历变量totalFilterFileItems,以获取所有的FileItem模型数据,并根据FileItem模型数据中的文件路径判断数据筛选管理类的变量treeNodeCache是否存在对应的文件夹缓存FileNode;
若存在对应的文件夹缓存FileNode,则将FileItem模型数据保存到缓存FileNode的fileChildrenNodes属性中;
若未存在对应的文件夹缓存FileNode,则根据FileItem模型数据创建筛选FileNode对象,并将FileItem模型数据保存至筛选FileNode对象的fileChildrenNodes属性中;
将数据筛选管理类的变量currentFilterNode作为扫描数据源对界面进行更新。
在一些可选实施例中,所述遍历变量totalFilterFileItems,以获取所有的FileItem模型数据步骤之前,包括:
暂停文件扫描管理类的变量fileQueue,并判断文件扫描管理类的变量isAssembling是否处于组装数据状态;
若所述变量isAssembling处于组装数据状态,则等待当前组装状态;
若所述变量isAssembling未处于组装数据状态,则清空上一次的筛选条件和筛选数据。
本实施例中,当用户在操作界面选择文件类型时,触发扫描过程中筛选功能。具体来说,首先将DiskEntityManager的fileQueue暂停,这样后续扫描抛出的数据,都将被加入队列中等待组装,而不会被立即执行。接着判断DiskEntityManager isAssembling是否正在组装数据,如果正在组装数据,则等待本次组装完毕。随后清空上一次的筛选条件和数据,DataManager treeRootNode对象根据筛选条件,将数据筛选后保存到totalFilterFileItems中,同时treeRootNode生成一份副本,赋值给FilterManagercurrentFilterNode。随后遍历totalFilterFileItems,以获取所有的FileItem模型数据,再根据模型数据中的文件路径nodeName判断FilterManager的treeNodeCache是否存在对应的文件夹缓存FileNode。如果缓存存在,则将FileItem模型数据保存到缓存FileNode的fileChildrenNodes属性中;如果缓存不存在,则根据文件路径从尾到头的顺序,查找最后一个缓存的文件夹节点,再依据剩余未创建的路径节点,依次创建FileNode对象,保存到上一个路径节点的FileNode属性folderChildrenNodes中,当保存到最后一个FileNode的时候,将FileItem模型数据保存到最后一个FileNode的fileChildrenNodes属性中。至此组装完成后,界面组件依据FilterManager currentFilterNode为数据源刷新界面,显示筛选数据,随后恢复fileQueue队列,继续组装数据。通过上述过程,FilterManager和DataManager的数据即可同时完成组装和数据隔离,此时根据用户是否设置了筛选条件,选择FilerManager或者DataManager进行界面更新即可。
可以理解的是,用户执行搜索后,数据保存在DataManager searchItems中,而如果此时进行筛选操作,则只需要遍历searchItems,并根据筛选条件筛选出数据后更新searchItems,随后刷新界面组件即可。
图2为本发明实施例提供的一种文件扫描装置200的示意性框图,该装置200包括:
数据创建单元201,用于通过代码构建工具创建数据管理结构和数据模型;其中,所述数据管理结构包括数据管理类、文件扫描管理类和数据筛选管理类,所述数据管理类包含有变量DataManager allFileItems,所述文件扫描管理类包含有变量fileQueue,所述数据筛选管理类包含有变量filterType;所述数据模型包括文件夹节点数据模型和文件根节点数据模型,所述文件根节点数据模型中包含有变量totalFilterFileItems;
字典创建单元202,用于创建rootNodeDic字典,遍历文件扫描管理类单次抛出的json文件数据,以获取所述json文件数据的NodeType类型,并将NodeType类型对应的RootNode对象保存至rootNodeDic字典中;
第一对象生成单元203,用于遍历获取所述rootNodeDic字典中的RootNode对象,根据遍历获取结果生成FileItem对象,并保存至变量DataManager allFileItems中;
筛选组装单元204,用于将FileItem对象同步传递至文件根节点数据模型,并由文件根节点数据模型进行筛选类型组装;
搜索扫描单元205,用于响应于用户的搜索请求,基于所述搜索请求对变量DataManager allFileItems进行遍历,得到对应的搜索结果;和/或,响应于用户的扫描请求,基于所述扫描请求对变量totalFilterFileItems进行遍历,得到对应的扫描结果。
在一实施例中,所述字典创建单元202包括:
暂停判断单元,用于设置文件扫描管理类的变量isAssembling为真,遍历获取文件扫描管理类单次抛出的json文件数据,并判断变量fileQueue是否暂停;
暂停判定单元,用于若判定变量fileQueue暂停,则将操作代码块添加到变量fileQueue的队列中等待执行;
未暂停判定单元,用于若判定变量fileQueue未暂停,则创建用于保存RootNode对象的rootNodeDic字典;
类型确认单元,用于遍历json文件数据以获取对应的文件信息,并根据所述文件信息确认json文件数据的NodeType类型;
对象判断单元,用于判断rootNodeDic字典是否存在对应类型的RootNode对象;
信息保存单元,用于若未存在对应类型的RootNode对象,则在rootNodeDic字典创建所述RootNode对象并保存,然后将文件信息保存到RootNode对象的samePathNode数组中。
在一实施例中,所述第一对象生成单元203包括:
字典遍历单元,用于遍历rootNodeDic字典以获取其中所有的RootNode对象;
属性遍历单元,用于遍历所有的RootNode对应的samePathNode属性,以获取所有的文件信息;
缓存判断单元,用于根据文件信息中的文件路径判断数据管理类的treeNodeCache是否存在对应的文件夹缓存FileNode;
第一对象缓存单元,用于如果判定存在对应的文件夹缓存FileNode,则将每个文件信息生成FileItem对象,并保存至缓存FileNode的fileChildrenNodes属性和DataManager allFileItems中;
第二对象缓存单元,用于如果判定未存在对应的文件夹缓存FileNode,则根据文件信息中的文件路径顺序,查找最后一个缓存的文件夹节点,并依据剩余未创建的路径节点依次创建FileNode对象,然后保存至上一路径节点的FileNode属性folderChildrenNodes中;
第二对象生成单元,用于当保存到最后一个FileNode时,将所有的文件信息生成FileItem对象,并保存至最后一个FileNode的fileChildrenNodes属性和DataManagerallFileItems中。
在一实施例中,所述筛选组装单元204包括:
同步传递单元,用于将FileItem对象同步传递至文件根节点数据模型,并由所述文件根节点数据模型根据FileItem对象的对象信息存储到对应的集合当中;
第一对象添加单元,用于判断数据筛选管理类的变量filterType是否为空,并当变量filterType不为空时将FileItem对象至添加到数据筛选管理类的属性currentFilterNode的assembleFilterSet属性中,并等待所有的数据处理完毕后组装;
第二对象添加单元,用于判断数据管理类的变量searchKeyWord是否为空,并当变量searchKeyWord不为空时将FileItem对象添加至数据管理类的属性searchFilterItems中。
在一实施例中,所述搜索扫描单元205包括:
关键字提取单元,用于基于所述搜索请求提取搜索关键字;
搜索对象获取单元,用于遍历变量DataManager allFileItems,以获取包含有搜索关键字的搜索FileItem对象;
第一界面更新单元,用于将所述搜索FileItem对象添加至变量searchItems中,并将变量searchItems作为搜索数据源进行界面更新。
在一实施例中,所述搜索扫描单元205还包括:
条件提取单元,用于基于所述扫描请求提取筛选条件,并根据所述筛选条件对数据管理类的treeRootNode对象进行筛选,得到筛选结果,并将所述筛选结果保存至变量totalFilterFileItem;
副本生成单元,用于利用变量treeRootNode生成关于所述筛选结果的副本,并将所述副本赋值于数据筛选管理类的变量currentFilterNode中;
模型数据获取单元,用于遍历变量totalFilterFileItems,以获取所有的FileItem模型数据,并根据FileItem模型数据中的文件路径判断数据筛选管理类的变量treeNodeCache是否存在对应的文件夹缓存FileNode;
第一模型保存单元,用于若存在对应的文件夹缓存FileNode,则将FileItem模型数据保存到缓存FileNode的fileChildrenNodes属性中;
第二模型保存单元,用于若未存在对应的文件夹缓存FileNode,则根据FileItem模型数据创建筛选FileNode对象,并将FileItem模型数据保存至筛选FileNode对象的fileChildrenNodes属性中;
第二界面更新单元,用于将数据筛选管理类的变量currentFilterNode作为扫描数据源对界面进行更新。
在一实施例中,所述搜索扫描单元205还包括:
组装判断单元,用于暂停文件扫描管理类的变量fileQueue,并判断文件扫描管理类的变量isAssembling是否处于组装数据状态;
组装等待单元,用于若所述变量isAssembling处于组装数据状态,则等待当前组装状态;
筛选清空单元,用于若所述变量isAssembling未处于组装数据状态,则清空上一次的筛选条件和筛选数据。
由于装置部分的实施例与方法部分的实施例相互对应,因此装置部分的实施例请参见方法部分的实施例的描述,这里暂不赘述。
本发明实施例还提供了一种计算机可读存储介质,其上存有计算机程序,该计算机程序被执行时可以实现上述实施例所提供的步骤。该存储介质可以包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
本发明实施例还提供了一种计算机设备,可以包括存储器和处理器,存储器中存有计算机程序,处理器调用存储器中的计算机程序时,可以实现上述实施例所提供的步骤。当然计算机设备还可以包括各种网络接口,电源等组件。
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的***而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。
还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的状况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。