2011-06-14 28 views
0

我目前有一些問題,我的UITableView,這是第一次我把縮略圖在我的表視圖單元格,並整合NSThread加載縮略圖,所以,請與我裸露。由於NSThread,UITableViewCell的和圖像

我下載的數據和設置像往常一樣在細胞,倒是這次與NSThread。

首先,我會打電話給ASIHTTPRequest在我看來,做負載

然後在 - (空)requestFinished:(ASIHTTPRequest *)的要求,我將添加縮略圖的網址進入一個NSMutableArray

NSString *photoURLString = [NSString stringWithFormat:@"http://some.url.com/img/%@",[thearray objectForKey:@"tn_url"]];  
[thumbNailURL addObject:(photoURLString)]; 

而且在的cellForRowAtIndexPath:我在哪裏設置的其他數據顯示,我會打電話給我的NSThread

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:indexPath]; 

而且在我的LoadImage線程

- (void) loadImage: (NSIndexPath*) indexPath{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSString *iconURL = [thumbNailURL objectAtIndex:indexPath.row]; 
NSURL *url = [NSURL URLWithString:iconURL]; 
UIImage *icon = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]; 
cellImageView = [[UIImageView alloc] initWithFrame:CGRectMake(11.0, 6.0, 61.0, 50.0)]; 
[cellImageView setImage:icon]; 
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
[cell.contentView performSelectorOnMainThread:@selector(addSubview:) withObject:cellImageView waitUntilDone:NO]; 
[pool drain]; 

}

的所有數據和圖像加載就好了,但如果我更快地上下滾動,應用程序會用以下錯誤掛

[1997:7a1f] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]' (0x31312d2f 0x345f50e3 0x3127d1b1 0x35aefc1d 0xf4dd 0x333ffb51 0x3347c67b 0x366af589 0x366b2310) terminate called throwing an exceptionProgram received signal: 「SIGABRT」. 

這將是巨大的,如果如果我錯了,任何人都可以告訴我正確的配置,因爲過去3天我一直在嘗試不同的方式。非常感謝。

回答

1

一對夫婦的事情。

首先,我建議你考慮使用類似SDWebImage用於異步下載圖像(看起來像奧利維爾·波伊特里是原作者)。 Github存儲庫在這裏:https://github.com/rs/SDWebImage。我用它來達到這個目的,這很好。

這麼說,我在這裏看到了一些東西。

1)你似乎沒有被檢查,如果細胞圖像已經被設置...無需重新下載的圖片,如果你已經得到了它。由於dataWithContentsOfUrl可能會提供一些緩存,所以您可能會忽略此操作,但我不確定。

2)我不能從這裏的代碼告訴我們,但你需要確保你不允許表視圖加載它的數據,直到被稱爲requestFinished。否則,您將遇到可能導致您看到的錯誤類型的競爭狀況。考慮設置在requestFinished方法的tableView的數據源,然後調用reloadData。否則,請按照建議中的提示操作,並僅使用[NSNull null]對象預填充URL數組。

+0

首先,非常感謝你的大力幫助,SDWebImage的作品非常棒!易於集成。 爲了涵蓋我在我的問題中遺漏了什麼,是的,我沒有檢查圖像是否存在,我猜它每次下載單元格時都會下載並導致崩潰(儘管我不確定應該在哪裏集成支票);我實際上有一個佔位符單元格設置,如果異步沒有完成,一旦完成,它會reloadData。所以一切都很好,直到NSThread的點。 – 2011-06-14 19:13:19

0

您是否嘗試讓數組「thumbNailURL」包含您試圖顯示的項目數量的[NSNull null]對象,然後在加載它們之後將它們替換爲異步,這樣您不能比陣列。

thumbNailURL = [[NSMutableArray alloc] init]; 
for (unsigned i = 0; i < [items count]; i++) { 
    [thumbNailURL addObject:[NSNull null]]; 
} 

然後簡單:

[thumbNailURL replaceObjectAtIndex:index withObject:thumbnail]; 
+0

謝謝,但我相信這是導致問題的NSThread,而不是陣列,如果異步請求尚未完成或返回任何結果,我會配置一個空白的加載單元。沒有NSThread加載圖像部分,一切都很好。所以,一定有一些問題,我不明白>,< – 2011-06-14 18:18:44