PDF 课件和源代码下载地址:
作者回复: 是的,只要有刷新的操作就可以。首先刷新的时机有几个,比如点击之后,或者重新在屏幕展示时,这两个区别也比较明显,能直观的观察到不同。当然在刷新的时候也要尽量避免使用reloadData,而使用reload相应的indexpath,以此提高性能,并且减少一些由于cell重用带来的UI bug风险
作者回复: 两个都是时序的问题哈 第一个问题:cell.news = model;这句代码应该在if (!cell)这个判断之后,因为初始化的时候没有cell,只有初始化alloc之后才会有cell,之后的布局才是有效的。对应的滚动之后能出现,因为使用的是重用的cell,所以这句代码可以被有效的执行。 第二个问题,同样是时序的问题 [self.listload addObserver:self forKeyPath:@"dataSource" options:NSKeyValueObservingOptionNew context:nil];这句话应该在 [self.listload loadListData];之前,因为有缓存的时候调用loadListData之后dataSource就已经赋值,之后添加addObserver是无效的,第一次有效是因为异步的有网络请求,所以真正赋值dataSource的时候addObserver已经执行。
作者回复: 页面卡顿,说明有比较重的逻辑占用了主线程,也就是UI线程。那么从问题的描述上看,已经确认了是由于加载图片导致的,简单的就可以将图片的下载逻辑、存储逻辑、甚至裁剪逻辑放到非主线程来运行,之后再回到主线程进行UI渲染。当然对于复杂页面的卡顿是个系统话的工程,除了以上简单的修改,还可以通过instrument看下具体的耗时,有针对性的进行优化
作者回复: 回顾了下视频,保存文章是否已读用的是setObject:forKey ,以Key-Value形式存储的哈。当然在视频里也提到了只是简单的演示,实际的项目中直接使用userDefaults,并且用id存储会导致语义不明不好维护,需要结合项目的kv存储框架进行业务层面的封装和设计。同时其实用数组存储也没有什么问题,每次取出全部的已读id,在判断是否有当前id即可,只是操作上因为维护全量列表会麻烦一些,低效一些。当然以我们目前场景的使用频率来讲也不需要过早的考虑性能问题,在保证历史逻辑、接口设计、稳定可维护即可。