dispatch_group 的崩溃

2,019 阅读1分钟

场景

最近项目里出现了一个比较严重的崩溃,即在推荐课程页面登录会导致dispatch_group_leave释放次数多余dispatch_group_enter次数,而在个人主页的时候不会,为什么会出现这种情况呢?

先来说一下原因:概括的说是dispatch_group的原理和AFNetworking网络请求回调block的缓存回调原理的协作问题 举例详细说明,流程图如下:


正常情况下:执行步骤1的间隔时间充分长,或者只执行一次,此逻辑没有问题,不会crash

非正常情况:开头所说的crash的情况下,即频繁执行图中1到3的步骤

因为网络请求的耗时和异步特性,这时候会发生一种情况

1. 第一次在步骤1创建了一个新的group1,这时网络请求n1到n4请求未返回,也就是b1到b4

还未调用;

2. 此时又执行了一次步骤一创建了一个新的group,命名为group2(这是一个新的,代码见上图),

并且赋值给了self.group,又执行步骤二,对group2进行enter,发送网络请求;

3. 此时若是1中的网络请求返回了,b1到b4就会调用,会对步骤2中创建的新的group2进行

leave操作,当2中的网络请求返回,进行回调时,会发生对group2进行额外的leave操作,

从而造成crash;

注:b1到b4因为leave的需要,会对group进行地址引用



ios10以下tableviewheaderView遮盖cell

 // 设置 tableHeaderView
  self.tableView.tableHeaderView = view;
 // 设置 view 的 frame
 view.frame = CGRectMake(0, 0, kScreenWidth, 90 * kScaleHeight);
先设置 tableHeaderView后设置frame会导致遮盖cell的情况

解决方案很简单,先设置frame,后设置tableHeaderView