簡體   English   中英

request.cancel()用於重復使用的單元Alamofire swift

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM