關于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];

}

 

同理當我們需要長時間的計算時,也要新開一個線程 去做這個計算以避免程序處于假死狀態

 

以上代碼只是示例, 還可以改進的更多, 比如從網上down下來一次后就將圖片緩存起來,再次顯示的時候就不用去下載。


上一篇: 深入了解OpenGL——顏色混合

下一篇: 沒有符合條件的記錄

分享到: 更多
分分快3稳赚不赔的攻略 最稳定追长龙的方法 11选5任三技巧 稳赚 快3猜单双技巧 孤仙时时彩计划软件 时时彩平台哪个好 北京pk10两期在线计划 2019篮球世界杯开战 幸运pk10计划破解版 快速时时是官方吗 完场即时比分直播 龙虎稳赢的公式方法 通比牛牛赢钱技巧 双色球胆拖投注表价格 快乐扑克奖金 吉林快3玩法有窍门吗