最近的项目模仿了支付宝做抢红包的功能。我额外的做了一个界面生产双红包的功能。(但是只是在一个刷新周期用产生一个红包的方式调用两次,却发现这样子引起了问题,后来由于上线期限的原因先把双红包特性取消掉(安卓没有做我自己加上去的)并没有深究。现在来找下原因。)
首先,页面卡顿肯定是由于 主线程之间发生了相互卡顿引起的。
假设1 :音效的 和 定时器阻塞
答案,否。 关闭音效一样出现
突然发现,跟位置生成函数有关。
突然想起,是否因为屏幕插不进去引起。
用po命令打出 self.sprites , 用笔记本画图,确实这里卡住了。
找到一个阻塞点。
假设2:
是因为之前的红包还没有被sprite数组 remove掉引起的。
答案,否,使用po命令发现实际上sprite superview 都还在
假设3:
新生成的红包和新红包互相卡
答案,确实。但是这种互相卡是因为没位置插入引起的。没有位置插入应该等待而不是引起主线程阻塞。
解决方式:
采用子线程等待主线程的方式,但是这样子最然解决了互相阻塞的问题,但是因为子线程和主线程使用了同样的数组,子线程在不断地遍历这个变量来判定
for (UIButton * buttonin self.sprites)
{
NSLog(@"xy %f",hypotf(x-button.center.x,y- button.center.y));
if (hypotf( x-button.center.x,y- button.center.y)*2 < half_hypotenuse +250) {
isGot = NO;
break;
}
}
而在主线程 self . sprites会在动画执行完成后会对self.sprites进行remove成员的操作。则样主子线程共享变量是非常危险的事情。因为这是一个数组,会引起一同时遍历数组时移除数组成员的crash。
解决的方案
1在逻辑上去除阻塞。我觉得此坑略大但是可以努力。
2信号量 加持 锁,每个线程访问时都上一把锁,访问后,恢复锁。其中主线程访问这个变量是有助于解除阻塞的。所以不会有问题。这个是 上os 系统给的启示。
3 这个功能可以砍掉吗。最喜欢这个方案了。- _-.
恩,我把他砍掉了因为本来就是我做出来玩的。现在只是不能加到项目里。