2017-10-11 16 views
0

CoreDataデータベースを使用して製品にデータを格納するアプリケーションを構築しています。これらの製品は、UICollectionViewに表示されます。このCollectionViewの各セルには、イメージを含む製品に関する基本情報が表示されます。SwiftのCoreDataからの非同期画像読み込み

セルは比較的小さいが、それらが表示する原画像は、より大きな画像ビューでも表示できる必要があるため、静かであることが好ましい。 > UICollectionViewCell { 細胞= collectionView.dequeueReusableCell(withReuseIdentifierましょう:は、 "セル"、:indexPath -

FUNCのcollectionView(IndexPath _ collectionView:::UICollectionView、cellForItemAt indexPath)画像は私のCellForItemAtIndexPath:方法でCoreDataから直接ロードされ)として!製品のコレクションが育つCollectionWineCell

var current: Product! 

    //product details are set on labels 

    //image is set 
    if current.value(forKey: "image") != nil { 
     let image = current.value(forKey: "image") as! WineImage 
     let loadedImage = UIImage(data: image.image) 
     cell.imageview.image = loadedImage 
    } else { 
     cell.imageview.image = UIImage(named: "ProductPlaceholder.png") 
    } 

    return cell 
} 

は、スクロールはbumpierに取得し、フレームの多くがドロップされます。これは私にとって理にかなっていますが、今のところ私は適切な解決策を見つけていません。オンラインで見ると、URL(オンラインまたはファイルパス)から非同期イメージを読み込むための多くのドキュメントとフレームワークが利用できますが、CoreDataからこれを行うことはあまり一般的ではありません。

私はすでにフェッチ要求を非同期を使用してそれをやって試してみました:

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:"ProductImage") 
     fetchRequest.predicate = NSPredicate(format: "product = %@", current) 
     let asyncRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { results in 
      if let results = results.finalResult { 
       let result = results[0] as! ProductImage 
       let loadedImage = UIImage(data: result.image) 
       DispatchQueue.main.async(execute: { 
        cell.wineImage.image = loadedImage 
       }) 
      } 
     } 
     _ = try! managedObjectContext.executeRequest(asyncRequest) 

しかし、このアプローチは、大量のデータセットを表示する場合のいずれか

QUESTION 物事をスムーズに思われません、 CoreDataの画像も含めて、UICollectionViewでラグやフレームドロップが発生しないようにイメージをロードするにはどうすればよいですか?

答えて

1

イメージがかなり大きい場合、より良い方法は、コアデータに保存するのではなくファイルに保存することです。コアデータにファイル名を格納し、それを使用してファイルをルックアップします。

しかし、それは直接の問題ではありません。それでも、画像データを開いたり、デコードしたりするのに時間がかかることになります。より良いアプローチは、基本的に、そうしないことです。コレクションビューでは、イメージはフルサイズよりもはるかに小さく表示されている可能性があります。フルサイズの画像を使用する代わりに、より適切なサイズのサムネイルを生成し、コレクションビューで使用します。サムネイルの生成は、ダウンロードしたものか、ユーザーの写真ライブラリかどこからでも、最初に画像を取得するたびに行います。サムネイルは、コレクションビューで使用するために保管しておきます。あなたが本当に必要なときにのみ、フルサイズの画像を使用してください。

画像を拡大縮小する方法については、多くのオンラインの例がありますので、ここでは取り上げません。

+0

ありがとうございます!私は私のアプリケーションでこれを実装し、明日あなたに戻ってきます! – Joris416

+0

私のプロジェクトであなたが言ったことを実装しました。私の画像は、作成および/または受信時に小さなサムネイルを生成し、コレクションビューの画像(NUKEを使用)に非同期にロードされ、スクロールがスムーズになります。あなたは、私がこのことを心配することなくプロジェクトを続けることができるように、私は助けてくれました。 – Joris416

関連する問題