关于抢红包线程卡顿的问题解决流程笔记

20 篇文章 0 订阅
16 篇文章 1 订阅
最近的项目模仿了支付宝做抢红包的功能。我额外的做了一个界面生产双红包的功能。(但是只是在一个刷新周期用产生一个红包的方式调用两次,却发现这样子引起了问题,后来由于上线期限的原因先把双红包特性取消掉(安卓没有做我自己加上去的)并没有深究。现在来找下原因。)

 首先,页面卡顿肯定是由于 主线程之间发生了相互卡顿引起的。

假设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 这个功能可以砍掉吗。最喜欢这个方案了。- _-.
 
恩,我把他砍掉了因为本来就是我做出来玩的。现在只是不能加到项目里。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值