首发地址:http://www.cnblogs.com/esrichina/archive/2012/11/08/2759744.html
使用过ArcGIS的Web APIs或者其他平台SDKs的人员,一定对各种各样的Tasks印象深刻,他们都功能强大且使用方便。如大家熟悉的QueryTask、FindTask、IdentifyTask、RouteTask、ClosesFacilityTask、ServiceAreaTask等,那么,在ArcGIS for iOS中也同样具有这些好用的Tasks,其用法也比较类似。这一讲我将通过QueryTask的实现来向大家展示Tasks在iOS中使用的一般流程。
首先,与其他平台不同是在ArcGIS for iOS中基本每个Task都有一个与子对应的TaskDelegate,他们是用来使用这些Tasks的类必须要遵守的协议。上一讲我向大家介绍了通过使用协议的方式实现委托模式的简单流程(要素绘制), 那么,在ArcGIS for iOS中所有的这些Delegates都是预先为大家封装好的协议,而在iOS开发中大量的使用委托这种设计模式,因此,这些Delegates为我们实现各种Tasks下的委托处理带来了极大的便捷。
接下来,我先向大家介绍QueryTask的实现过程,然后,我们再来总结在iOS中Tasks的使用的一般流程。
同样,我们先构建一个支持ArcGIS服务能力的工程,这里我添加了系统的Search Bar来输入查询条件,以之前介绍的方法右键连线到.h文件,调节其位置,包含相关协议,并声明QueryTask的相关对象QueryTask、Query,声明要素显示土层GraphicsLayer等,具体如下图。
和之前的MapViewTouchDelegate协议使用方法相同,只需要在类的声明中用<>包含协议即可。SearchBar的使用也是类似,包含协议后就可以实现该协议的相关方法,在iOS设备上的虚拟键盘相信大家都不陌生,当我们输入完成点击Search按钮是应用系统会执行查询操作,其实它都说通过SearchBarDelegate这个协议实现了相关委托。
在类的声明种包含相关协议后,就可以在该类的实现文件中添加所包含协议的实现方法来完成相关操作。首先来看Searchbar点击Search按钮的实现函数。
可以看出,我们需要做的操作其实很简单,就是对QueryTask和Query进行初始化,设置相应参数,这些与其他APIs用法类似,相信大家都已经不再陌生。唯一不同的就是大家要不断总结和掌握Objective-C的语法和灵活应用。
在此说明下,这里的_queryTask和_query就是我们在.h文件中声明的相应对象的实例变量(以后出现_XXXX也是类似)。
接下来我们需要做就是对QueryTask的执行情况来进行相应的处理,同样因为有QueryTaskDelegate协议的包含,我们可以来实现该协议的方法,主要包括有查询结果的操作和查询出错的提示。
首先,我们对返回的纪录条数判断,大于0说明命中,然后,定义面要素的渲染样式,在for循环里面处理要素,如果只有唯一的命中结果,我们通过mapView的zoomToEnvelope来进行缩放,这些操作都与其他的APIs相似,大家可以查看ArcGIS for iOS自带的帮助文档,里面都有详细说明。当记录等于0说明没有命中,做提示
其次,我们还需要对查询出错做相应的提示
另外,QueryTaskDelegate协议还包含如下方法,大家可以参考帮助,按照需要来实现相应的操作。
最后我们来看看运行效果:
温馨提示:也许,你也这样做了,而且程序运行良好,可就是没有得到想看到的结果,那么你需要考虑如下两点:第一,查询的要素图层投影与当前底图投影是否一致;第二,查询结果要素是否使用了正确的渲染符号。
最后,我们来总结下Tasks使用的一般流程。相信通过上面QueryTask的实现,我们不难发现其使用方法与其他APIs并没有太多区别,就是使用了协议的委托模式来实现。
1.声明使用相关TaskDelegate协议的类时,用<>包含相关协议,并声明相关Task和所需对象;
2.实现协议的相关方法;
3.初始化Task以及所需参数;
4.设置Task的委托对象(可以是自己哦);
5.执行Task;
总结:本讲希望通过对QueryTask的实现来向大家介绍ArcGIS for iOS中各种Tasks使用的一般流程,建议大家多参考联机帮助的文档来实现相关功能。下一讲我将向大家介绍GeometryService和GeometryEngine的使用,欢迎大家继续关注!