我正在試圖將favicons合併到UITableView中。該表基本上提取網站,我想在右側顯示favicon。最初,我在右側放置了一個佔位符圖標,並讓後臺運行一個函數。該功能採用網站的URL,解析並嘗試查找網站圖標。如果找不到,它會保留相同的佔位符圖像;否則,它會用該網站的圖標替換它。我最初嘗試使用[tableView reloadData],它在模擬器中運行良好,但它確實有些奇怪和不可靠的事情(例如,它會創建一些單元格,但留下一個巨大的空單元格)。無論如何,我偶然發現了reloadRowsAtIndexPaths,它看起來像我需要使用的函數。但是,結果仍然非常不可靠。我有我的抓取功能在後臺運行,這樣:reloadRowsAtIndexPaths停止加載UITableViewCells?
在FetchFaviconWrapper- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...//other code here for showing website labels
//obtain the favicon.ico
if(!this_article.iconLoaded){
this_article.iconLoaded = TRUE;
NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys:this_article, @"article", indexPath, @"indexPath", nil];
[self performSelectorInBackground:@selector(fetchFaviconWrapper:) withObject:args];
}
cell.favicon.image = this_article.icon;
return cell;
}
:
- (void)fetchFaviconWrapper:(NSDictionary *)args {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self fetchFavicon:[args objectForKey:@"article"]];
NSArray *paths = [NSArray arrayWithObject:[args objectForKey:@"indexPath"]];
[articleTable beginUpdates];
[articleTable reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[articleTable endUpdates];
[pool release];
}
基本上,fetchFavicon需要一個網站,需要主機URL,追加 「/favicon.ico」,構建它變成一個NSData對象,並找到圖像(如果它存在)。但是,這也相當不可靠。在後臺運行線程時替換佔位符圖像的最佳方式是什麼?我可以在主線程上做所有事情,但這隻會讓桌面加載速度變慢。似乎有些東西是我忽略的,或者是我忘記添加的東西......只是無法弄清楚。
是的,我試過了,但我幾乎得到了同樣的東西。儘管我注意到,如果我向下滾動,那麼最初沒有顯示的網站(如第5-6頁)會在我下樓時重新加載。所以,我猜這只是第一個有問題的6個人。但爲什麼會有這種行爲?此外,我意識到,按下時已正確重新加載動畫的單元格(在突出顯示時變爲藍色),以及沒有正確動畫的單元格。 – SpacePyro 2011-05-31 21:33:04
只是一個問題:你是從輔助線程修改UI(使用UIKit)嗎? – sergio 2011-05-31 21:45:39
那麼,我設置了(如果我沒記錯的話)是我有網站通過performSelectorInBackground獲取。在fetcher函數結束時,我有'[articleTable reloadData]'。我不知道是否會擾亂任何東西,但我想所有這些都在後臺的獨立線程中運行。當'cellForRowAtIndexPath'被調用時,以及何時需要找出顯示哪個圖標,它會啓動一個額外的線程(如上面在原始文章中所述)。 – SpacePyro 2011-05-31 21:50:05