原项目出现几个问题,今天做了些修改,其中包括有多异步任务后执行某操作的问题,就此做个总结。
1、进入app主页的时候信息加载很慢,原因是进入时使用了多个异步请求,并没有处理好异步请求的同步问题,即没有做好两次异步请求后继续操作的同步,(多次异步任务后的执行某任务,异步任务group化)
解决方案:
使用dispatch_group的组操作方式,dispatch_notify可在diaptch_group所有任务结束后监听到结束消息。使用nsurlsession发请求,由于nsurlsession只能做异步请求,需要对group里的任务进行加锁保证group任务里的操作同步,加锁使用dispatch_semp_t信号量对象。注意dispatch_semp_create创建时参数需要传0,值的具体含义可以自行百度。期间试图通过直接使用信号量即使用其原有的请求函数时并不能达到效果,原因是请求没有进回调,至于为什么没有进入回调,原因待查。
延伸:
多次异步任务后的执行某任务解决方案:
一、即使用dispatch_group dispath_notify方式,可保证多个异步任务无顺序执行,若需要顺序执行需要书序执行,可使用dispatch_enter dispatch_leave方式,需要注意的是dispatch_group里的任务需是同步任务
二、使用信号量和计数,不使用dispatch_group,单个异步任务执行完成后计数值加,值等于任务数后说明所有任务执行完成,释放信号量,执行后续操作。这时需要保证该计数值的原子性,保证其线程安全
dispatch_group dispatch_group_notify模式类似于信号量机制,notify里的任务在多任务执行完后多个信号量释放后方执行,
2、文件列表图片加载时崩溃,原因是demo里面的sdwebimage和lib里使用的sdwebimage版本不同,demo里的sd并未提供lib里使用的相应方法所致
解决方案:
用lib库调用的sd替换demo里的sd
3、前几次调试的时候始终报 smartdelagate没有x86定义之类的问题,原因是真机运行时,使用的是模拟器的lib包所致
4、在demo里面出现崩溃现象,工程能进入Lib包相应crash位置(Lib里有断点也能进入)但是没有调试信息,原因是lib工程的build设置了release版本的优化等级optimizable level,在build setting里,
解决方案:
将optimizable level release的值设置为和debug相同即可。
网友评论