詳解TableView中圖片延時(shí)加載
TableView中圖片延時(shí)加載是本文要介紹的內(nèi)容,經(jīng)常我們會(huì)用tableView顯示很多條目,有時(shí)候需要顯示圖片。但是一次性從服務(wù)器上取來所有圖片對用戶來浪費(fèi)流量,對服務(wù)器也是負(fù)擔(dān),最好是按需加載,即當(dāng)該用戶要瀏覽該條目時(shí)再去加載經(jīng)常我們會(huì)用tableView顯示很多條目。
有時(shí)候需要顯示圖片, 但是一次從服務(wù)器上取來所有圖片對用戶來浪費(fèi)流量,,對服務(wù)器也是負(fù)擔(dān).最好是按需加載,即當(dāng)該用戶要瀏覽該條目時(shí)再去加載它的圖片。
重寫如下方法
- - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UIImage *image = [self getImageForCellAtIndexPath:indexPath]; //從網(wǎng)上取得圖片
- [cell.imageView setImage:image];
- }
這雖然解決了延時(shí)加載的問題, 但當(dāng)網(wǎng)速很慢, 或者圖片很大時(shí)(假設(shè),雖然一般cell中的圖很小),你會(huì)發(fā)現(xiàn)程序可能會(huì)失去對用戶的響應(yīng).
原因是
- UIImage *image = [self getImageForCellAtIndexPath:indexPath];
這個(gè)方法可能要花費(fèi)大量的時(shí)間,主線程要處理這個(gè)method,所以失去了對用戶的響應(yīng).
所以要將該方法提出來:
- - (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath
- {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- UIImage *image = [self getImageForCellAtIndexPath:indexPath];
- UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
- [cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
- [pool release];
- }
然后再新開一個(gè)線程去做這件事情
- - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
- {
- [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget:self withObject:indexPath];
- }
同理當(dāng)我們需要長時(shí)間的計(jì)算時(shí),也要新開一個(gè)線程 去做這個(gè)計(jì)算以避免程序處于假死狀態(tài)
以上代碼只是示例, 還可以改進(jìn)的更多, 比如從網(wǎng)上down下來一次后就將圖片緩存起來,再次顯示的時(shí)候就不用去下載。
小結(jié):詳解TableView中圖片延時(shí)加載的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!