- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
這個(gè)代理方法的實(shí)現(xiàn),在可見(jiàn)的頁(yè)面是會(huì)重復(fù)繪制頁(yè)面的,所以絕大部分人都會(huì)在這里做一些代碼處理
比如:
static NSString *CellIdentifier = @"LazyTableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
很常規(guī)的顺又,防止cell對(duì)象無(wú)限的被創(chuàng)建蛙埂,等同于android里面適配器的方法
public View getView(int position, View convertView, ViewGroup arg2)
以上舉例代碼是可以讓cell被重復(fù)使用,一般大概只會(huì)在可見(jiàn)頁(yè)面部分的幾個(gè)cell會(huì)被new下劫映,其他的全部重復(fù)使用前面已經(jīng)有的cell對(duì)象,到時(shí)候只要填充數(shù)據(jù)就可以了
啰嗦下,android里面也是類似的處理的赁濒,給view添加tag值,到時(shí)候利用tag獲取view對(duì)象
那么僅僅只是如此孟害,恐怕現(xiàn)在的cell自定義的頁(yè)面不只是文本那么簡(jiǎn)單拒炎,多多少少都會(huì)帶有一些圖片吧,當(dāng)你下滑時(shí)候是否發(fā)現(xiàn)有那么一點(diǎn)點(diǎn)的卡頓現(xiàn)成挨务,特別是網(wǎng)絡(luò)不好击你,而且還是在iPhone4上跑的就會(huì)更明顯了
那么在cell里面異步加載圖片是個(gè)程序員都會(huì)想到玉组,但是如果你給每個(gè)循環(huán)對(duì)象都加上異步加載,并且下滑的時(shí)候丁侄,這一操作將會(huì)被執(zhí)行惯雳,雖然是異步,但是一個(gè)app里面的線程過(guò)多也會(huì)卡頓的鸿摇,特別是在下滑操作的時(shí)候給每個(gè)圖片進(jìn)行異步加載
那么這里可以利用UIScrollViewDelegate代理很好的解決這問(wèn)題
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
可以識(shí)別tableview禁止或者減速滑動(dòng)結(jié)束的時(shí)候進(jìn)行異步加載圖片
以下方法來(lái)執(zhí)行異步加載操作
//獲取可見(jiàn)部分的對(duì)象
NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *indexPath in visiblePaths)
{
//獲取的dataSource里面的對(duì)象石景,并且判斷加載完成的不需要再次異步加載
}
同時(shí)在cell繪制中也做限制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
{
//開(kāi)始異步加載圖片
}
如果tableview停止滑動(dòng)的時(shí)候開(kāi)始異步加載圖片
最后也別忘記在內(nèi)存緊張的情況下釋放調(diào)所有的異步線程,以保證的你的app不會(huì)被系統(tǒng)強(qiáng)制關(guān)閉
- (void)didReceiveMemoryWarning{
//釋放調(diào)異步加載圖片的線程以及所有圖片資源對(duì)象
}
還有千萬(wàn)別忘記銷毀的時(shí)候手動(dòng)把所有的使用到的代理設(shè)置nil
至此性能優(yōu)化結(jié)束户辱,來(lái)源于官方文案