2013-08-31 31 views
0

我有一個UITableView,它用縮略圖圖像填充其單元格。就我而言,縮略圖是從服務器下載的。我的代碼如下:將縮略圖下載到UITableViewCell

if (![self thumbnailExists]) 
{ 
    self.thumbnailImageView.image = nil; 
    [self.activityIndicatorView startAnimating]; 

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock: 
    ^{ 
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.thumbnailURL]]; 
     UIImage *image = [UIImage imageWithData:data]; 


     [[NSOperationQueue mainQueue] addOperationWithBlock: 
     ^{ 
      SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath]; 
      [submenuScrollViewTableViewCell.activityIndicatorView stopAnimating]; 
      submenuScrollViewTableViewCell.thumbnailImageView.image = image; 
     }]; 
    }]; 

    [self.operationQueue addOperation:operation]; 
    [self.operationQueues setObject:operation forKey:[self title]]; 
} 

此代碼基於偉大的WWDC2012演示文稿:「在iOS上構建併發用戶界面」。我的代碼和演示文稿中的代碼之間的主要區別在於我使用從網絡中檢索的數據填充單元格。

它在大多數情況下都能正常工作,但是我遇到的問題是如果我的滾動速度非常快,那麼其中一個單元格可能會顯示錯誤的縮略圖(通常我注意到所述單元格會是該縮略圖所屬的單元格)。我應該提到這個代碼正在被執行的layoutSubviews方法被覆蓋的UITableViewCell

任何人都可以發現此代碼中的任何缺陷?

+0

你知道了嗎? – AdamG

+0

@AdamG - 是的,我看到下面,感謝您的幫助給了你一個點。 –

回答

0

該問題與上述代碼位於我創建的子類UITableViewCell的layoutSubviews方法中有關。當我將它移回cellForRowAtIndexPath方法時,問題就消除了。

1

你的代碼是打破的原因是因爲該行的代碼:

SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath]; 

你抓住的索引路徑單元格時這就是所謂的並把它放在任何細胞是在這個指數路徑時該單元被重用。當視圖移動速度非常快時,這可能會在不同的單元格中顯示不同的圖像,並且服務器的響應時間可能不同。

確保您取消prepareForReuse中的操作並清除單元格圖像,以便它不會將圖像放在錯誤的單元格中,或者圖像不會被重用。

此外,從單元本身調用tableView通常是不好的做法。

+0

感謝您的迴應Adam。我已經看到了許多地方推薦的代碼行,因爲這個想法是,如果單元格已經從屏幕上滾下來,它將返回零。儘管我沒有從單元本身調用tableview,但我明白你的觀點。有沒有可能這個問題源於UITableViewCell中的代碼,而不是UITableView本身? –

+0

我認爲這可能是問題。我在想,既然單元格正在被重用,self.indexPath的引用就會帶回一個非零響應。這也解釋了爲什麼它可能是細胞的倍數。如果出現這個問題,解決方案可能是在異步回調之前調用該塊時,將indexPath存儲在塊右側,並使用存儲的indexPath來抓取單元。 – AdamG

+0

嘗試在cellForRowAtIndexPath出列單元格後將imageview的圖像屬性設置爲零,以避免在多個單元格中出現一個圖像。 – hacker2007