IOS 延時載入TableView中Cell中的圖片
TableView中圖片延時載入是本文要介紹的內容,經常我們會用tableView顯示很多條目,有時候需要顯示圖片。但是一次性從伺服器上取來所有圖片對使用者來浪費流量,對伺服器也是負擔,最好是按需載入,即當該使用者要瀏覽該條目時再去載入經常我們會用tableView顯示很多條目。
有時候需要顯示圖片, 但是一次從伺服器上取來所有圖片對使用者來浪費流量,,對伺服器也是負擔.最好是按需載入,即當該使用者要瀏覽該條目時再去載入它的圖片。
重寫如下方法
- - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UIImage *image = [self getImageForCellAtIndexPath:indexPath]; //從網上取得圖片
- [cell.imageView setImage:image];
- }
這雖然解決了延時載入的問題, 但當網速很慢, 或者圖片很大時(假設,雖然一般cell中的圖很小),你會發現程式可能會失去對使用者的響應.
原因是
- UIImage *image = [self getImageForCellAtIndexPath:indexPath];
這個方法可能要花費大量的時間,主線程要處理這個method,所以失去了對使用者的響應.
所以要將該方法提出來:
- - (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];
- }
然後再新開一個線程去做這件事情
- - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
- {
- [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget:self withObject:indexPath];
- }
同理當我們需要長時間的計算時,也要新開一個線程 去做這個計算以避免程式處於假死狀態