对于百度地图API搜索请求,消息请求,线程控制等最新应用心得

内容可能较为散乱,皆是最近学习的一部分心得,记录下以备不时之需

首先是对百度地图API请求机制的一点理解。

百度地图API并非开源请求,所以针对于其内部机制,只是从使用上面一些猜的而已,如有错误,忘情指教

第一,百度地图的消息推送,百度地图API的消息推送并非之前所使用的一些API包是通过HTTP请求发送消息,应该是TCP/IP的消息推送,因最近再使用搜索功能再优化期间发现的一些BUG推断,当搜索对象在数次发送相同请求之后出现了crash而crash的原因通过百度查出可能是因为消息列队或socket阻塞引起的,而之前在其他项目上并未碰到过此类情况,所以推断可能是因为传输机制的差别而产生的

第二,百度地图的响应机制也略有差异,虽然同其他的网络应用API(如新浪微博,腾讯微博等)同样拥有相似的回调方法来处理请求结果,但是新浪微博和腾讯微博等采用的方式是可以自设回调函数,通过设置的回调对象和函数指针来实现消息回传,而百度地图则是使用协议委托的机制,遵从协议后完成指定的方法从而处理返回的结果数据,后者更加符合IOS惯有的程序理念,而二者各有优缺点,前者的优点是足够灵活,灵活程度几乎可以媲美弱类型语言,但是缺点也是对编写者要求较高,使用起来较为繁琐,并且上手的难度略为高一些,错误也容易出现,如果是自己完成可能还略为好一些,如果是团队协作就很容易出现各种各样的错误,因为通过函数指针调用的方法传参只能是id类型,对于数据的结构等错误理解,很可能导致很多不必要的错误,而后者则没有这些缺点,完整的参数列表,多参数的设置,可以让其他程序编写者很容易理解函数的意图以及使用方法,而缺点就在于过多的代码冗余再一起,当然可以通过调用多个方法将代码分离开来,但是始终是不够方便,再一些情况下过多的判断使代码看来很空洞,难以编写易于理解的代码。

第三,说说关于线程的操作,IOS中的线程操作十分强大简便,但是正是由于简便,很多时候反倒感觉到无从下手,改如何关闭以及怎样关闭线程,对于现在的我来说依然有些模糊,尤其是混入ARC机制之后更是时而让人摸不着头脑,就目前而言,我对大家提出几点使用线程的建议,如有错误还忘情指教,首先,线程套线程的操作应当尽量避免,可能是由于个人习惯的原因,我很多时候再开启线城时并非是使用NSThread,而是使用

performSelector…一系列方法(这个习惯可能很不好。。。由于没有老师教导。。。我只能自行摸索所以不敢妄言。。。),这种方式开启的线程,你无法得以全局的控制,所以也就不能像使用普通的NSThread对象那样取判断isCancel属性来对线程进行exit操作,而根据个人经验,如果在这种情况下,再去无限制的开启线程,那么你的线程数只能突飞猛进,到数十,甚至造成很多线程无法关闭,那么碰到需要再线程之中在开启线程的需求怎么办呢?我也遇到了这个问题,比如再使用自行封装的http请求类的时候,异步请求的回调函数中需要使用其中数据来开启新的视图或再次发送一个异步请求等,这种情况下如果保存到类内属性,则不知该何时开启视图,简单的通过延时调用来解决只是唯心主义的自我欺骗,不符合正确的逻辑观念,所以并不可取,我推荐给大家一个好的办法,就是将需要开启视图的代码封装成函数,然后这是通过performSelectorOnMainThread:withObject:waitUntilDone:方法将封装的好的函数运行再主线程上,这样,不论如何开启线程,都是在主线程开启,就可以关闭当前的子线程避免冗余的情况发生。

最后再说一个刚解决过的小BUG,这个BUG虽然解决起来容易,不过找出问题确花费了我不少功夫,BUG是这样的,再我们当前制作的项目中,一个提交订单的请求发送之后,会跳转到下一个界面,而在下一个界面经过一定时间后则会返回到之前的界面,如此反复的操作之后会出现的creash的BUG,经过反复查证原来是百度地图BMKSearch引发的BUG,BUG的起因如下:在下订单的界面中ViewDidLoad会创建视图对象并且对其设置,经过一番操作,跳转到下一个界面之后再次返回之前的界面,而此时的BMKSearch执行搜索操作时就会出现crash,而crash的原因可能是以下几种,第一可能是再下单视图推入下一层视图时被销毁,而回调委托找不到之前的对象而crash,第二可能是之前的delegate委托对象依然在执行中,线程并未正常退出,导致的消息列队阻塞,第三还可能是之前的Search对象已经销毁而且当前的对象并未重新设置过委托对象从而返回的消息无法正确发送给视图(因为调试过程中最后发现crash虽然可以避免但是会一直无法接收到百度地图的搜索消息返回),恕本人愚钝。。。暂时还不能给出正确的解答,但是可以肯定的是,通过重新设置BMKSearch对象的委托即可解决当前的Crash问题,算是以解燃眉之急吧。。。

以上是最近几天的探索心得,记录下来,一来与众看官分享讨论,二来以备个人日后学习参考备忘