![](/img/trans.png)
[英]How to cancel `request.Cancel()` During `appWillterminate` in AlamoFire?
[英]request.cancel() for reused cell Alamofire swift
我有一個帶有圖像的集合視圖,我正在使用Alamofire和AlamofireImage作為網絡代碼。 在cellForItemAtIndexPath的開頭,我將圖像設置為nil,並使用request?.cancel()取消任何正在進行的請求(如果存在)。 但是這樣做的話,有些單元格根本不會填充圖像。 你能告訴我我做錯了什么嗎? 請參閱下面的我的cellForItemAtIndexPath代碼:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! StoreCell
let entry = self.dataCell.addCell[indexPath.section][indexPath.item]
stringURL = "https://website.com/stories_db/images/\(entry.filename)"
cell.title.text = entry.title
cell.subTitle.text = entry.author
cell.cost.text = entry.cost
// Reset the cell
cell.storyImage.image = nil
// request?.cancel()
if let image = dataCell.cachedImage(stringURL) {
cell.storyImage.image = image
} else {
request = dataCell.getNetworkImage(stringURL) { image in
cell.storyImage.image = image
}
}
// Fix the collection view cell in size
cell.contentView.frame = cell.bounds
cell.contentView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
return cell
}
看起來您正在重復使用一個名為request的變量來存儲圖像請求。 如果一次可以看到多個集合視圖單元,則可能需要一次發出一個以上的異步圖像請求,因此需要一種存儲多個正在進行的請求的方法。
例如,如果您的集合視圖有三個單元格,並且所有單元格都是可見的,則在重新加載時,它將調用cellForItemAtIndexPath來獲取第一個單元格。 您的代碼將創建該單元格,並啟動對“圖片1”的異步請求,並將其存儲在您的請求變量中。
然后,收集視圖立即再次調用cellForItemAtIndexPath以獲取第二個單元格。 如果“ Image 1”的請求仍在進行中,則調用request?.cancel()會中斷它,因此“ Image 1”將永遠無法完成下載。 然后,代碼為“圖片2”創建一個新請求,並將其分配給請求。
集合視圖立即調用cellForItemAtIndexPath來獲取第三個單元格。
一種解決方案是存儲活動請求的數組(或字典)。 發出請求時添加請求,完成請求后將其刪除(失敗或成功)。 然后,如果您確定要重復使用的單元正在處理中,請取消該請求並將其從列表中刪除。
另一種方法是創建一個自定義單元子類,並使其存儲活動請求。 這具有使將請求與單元關聯起來更簡單的優點。
使用這兩種方法時,您可能要考慮取消對UICollectionViewCell.prepareForReuse()中單元格的活動請求,而不是取消cellForItemAtIndexPath。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.