需求
之前要实现一个需求,大概是:
- 数据源不定时地来向一个View写进数据。
- View在有数据时需要按来到的顺序一个一个地做动画效果,然后把用完的数据丢掉
复杂点的解决过程
看完,脑子瞬间想到的,这不是一个典型的生产者-消费者
模型吗。
然后想到接下来第一反应就是,一个队列 + NSCondition + NSOperation。
- 一个线程不停的地读,没数据就挂起
- 来数据就往队列里写,然后来的是第一条就唤醒线程
写一个队列
网上找来找去都没有看到Objective-C队列类,好,自己去实现一个。
- 当年数据结构老师太严格,脑子就已经形成潜意识,写队列,就是写一个循环队列
- 发现循环队列容量固定,满足不了需求,于是就写了一个可以扩容的的循环队列
- 当容量扩得太大,而数据量不多的时候,是不是就需要减容了?????!
写实现逻辑
- 队列 + NSCondition + NSOperation
实现之后
自测的时候,想了很多条件和预期结果,怕测试漏了给同事解释一遍逻辑让他帮忙想想
同事给了一句话,好像有点复杂,越简单越好,出错容易定位问题。
简单点的解决过程
回家后脑子里面一直想着这个问题。有时候一个想法扎进去了其实挺可怕的,后面缓了一下想到的简单方法:
简单队列
定义:
NSMutableArray *queue;//可以自动扩容哦
入队:
[self.queue addObject:obj];
出队:
if (self.queue.count) {[self.queue removeObjectAtIndex:0];}
- 队头:
self.queue.firstObject;
实现逻辑
- 动画并不阻塞主线程
- View一次动画完了,递归地去取数据,出队列,据再进行动画。没数据就停了。
- 来数据时,数据加入队列,当View动画没有在执行的时候,让View去执行那个递归取数据的动画
并没有用到多线程,并不需要自己写队列。
一个简单的需求感觉好像做得点复杂了,当时我就懵逼了
。
总结
1.做之前尽量多想一下。
2.尽量往简单的方面去想,实现思路越简单,出错越容易定位。
3.当思路已经扎进去了,觉得有点复杂了,想下第2点,或许会有更简单的方法。
4.多了一个能自动扩容,不能减容的队列类,循环队列思路,有兴趣的拿去玩玩