双重for循环怎样优化效率

判断一个日期是否有红点,不需要去遍历数据。既然你的日历数据是从服务器下发的,你下发的数据不应该是一组有红点的日期,然后用每个日期去一个一个匹配他。应该下发一组对应关系,这组关系包含了某个日期是否有红点。你可以把一个月的日期整个下发下来,数据里面包含了每天是否有红点。或者服务器下发一个set,根据日期构造一个key去查是否有红点,这大约可以减到O(logn) ~ O(1),查一次,之后都是O(1)。退一步讲,即便你的数据真的就是一组有红点的日期,你也可以用它构造一个set,用日期构造key,能查到就是有红点,否则就是没有。大约O(logn)。我的意思是每个日期他是一个model,它的属性你在绘制前就构造好了,是否有红点是不需要去查的。至于怎么构造我建议是下发下来就有他整个的属性。简单说就是要把原来O(n)的查询通过model、dict或者set的方式压到O(1) ~ O(logn)另外就是预加载的策略,用户第一眼看到的东西优先级是最高的,不管你做什么缓存或者预加载,都应该让用户第一眼看到的界面最先出来。你可以先把当前页读出并绘制出来,然后再去加载前后的人页面。至于是否需要预读取五页,我觉得是不需要的,看你视觉怎么设计,我觉得读取前后两页就好了。对于日期的处理,要避免频繁的alloc一个新的date formatter,因为ObjC的date formatter效率很低。最好连format动作都要避免频繁去做。还有就是,不管怎么样先让日期展示出来,再去绘制红点。
■网友
这个问题解决了,我直接粘贴代码把。感谢钟颖Cyan的回答,很受启发。在取到数据之后,直接把他们放到全局字典里,字典正好还有排重功能。-(void)reloadData{ _allScheduleArray = ; for (ScheduleEntity *schedule in _allScheduleArray) { NSString *currDateStr = ] format:kDateFormat]; NSLog(@"%@",currDateStr); ; }}然后每次调用比较的时候,只需要看字典里有没有这个键就好了,有就return YES- (BOOL)calendarHaveEvent:(JTCalendar *)calendar date:(NSDate *)date{ NSString *oldDateStr = ; if (_markDic) {//存在即找到 return YES; } return NO;}这样改之后,效率大大提高,用户完全感受不到2秒的等待了,秒出。


    推荐阅读