2017-12-28 7 views
0

私のサーバー上でユーザーのプロフィールを検索します。ユーザーがユーザー名を入力すると、別の推奨プロファイルがUITableViewのセルに表示されます。各プロファイルには、それに関連付けられたイメージがあります。 cellForItem(at:)関数を使用して、ユーザーが入力すると、イメージは非同期に読み込まれます。ユーザーが検索するように入力すると、サーバーに対する検索要求が取り消されますが、非同期要求も取り消す必要があります。一度に複数のリクエストが発生する可能性があります - どのように私はそれらを追跡する必要がありますか?私がしたい場合は、私はrequest = model.downloadImage(...を追加することができますが、requestだけdownloadImage()関数が呼び出されたことを最後の時間へのポインタを開催する新しい検索でuitableviewcellsの非同期画像を読み込む方法をキャンセルするには

model.downloadImage(
    withURL: urlString, 
    completion: { [weak self] error, image in 
    guard let strongSelf = self else { return } 
     if error == nil, let theImage = image { 
      // Store the image in to our cache 
      strongSelf.model.imageCache[urlString] = theImage 
      // Update the cell with our image 
      if let cell = strongSelf.tableView.cellForRow(at: indexPath) as? MyTableCell { 
       cell.profileImage.image = theImage 
      } 
     } else { 
      print("Error downloading image: \(error?.localizedDescription)") 
     } 
    } 
) 

注:画像をダウンロードする

私のコードは次のようです。

答えて

0

このような目的のためには、Kingfisherを使用することをおすすめします。画像をダウンロードしてキャッシュするための強力なサードパーティライブラリです。カワセミを使えば、簡単に呼び出すことによって、あなたが望むものを達成することができます

// In table view delegate 
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    //... 
    cell.imageView.kf.cancelDownloadTask() 
} 
0
あなたは非常に(それをキャンセルできるタスク)をこの正確な機能を提供する10.10 DispatchWorkItemが導入されました&のMacOSのiOS 8、とGCDを、使用することができます

使いやすいAPIです。

これは一例です:ユーザーが情報を入力したとき:あなたのケースでは

class SearchViewController: UIViewController, UISearchBarDelegate { 
    // We keep track of the pending work item as a property 
    private var pendingRequestWorkItem: DispatchWorkItem? 
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
     // Cancel the currently pending item 
     pendingRequestWorkItem?.cancel() 
     // Wrap our request in a work item 
     let requestWorkItem = DispatchWorkItem { [weak self] in 
      self?.model.downloadImage(... 
     } 
     // Save the new work item and execute it after 250 ms 
     pendingRequestWorkItem = requestWorkItem 
     DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250), 
             execute: requestWorkItem) 
    } 
} 

、あなたは、デリゲート(TextFieldの一例)を介して知っている必要があります。

関連する問題