2016-07-01 5 views
3

グリッドパターンでscrollingを持つUICollectionViewと4 cellsを持っています。各セルには単一のimageViewがあります。 imagesはアセットフォルダに保存され、名前参照によって取得されます(下記参照)。いくつかのUIアクションの後、アイデアはswift - UICollectionViewまたはUIImage - イメージキャッシングを防止する方法

collectionView.reloadData() 

にあり、各cellimageを交換してください。

すべてが正常に動作しますが、メモリの使用は、各リロード後climbingを保持します。私はreloadData()ダンプunnecessarydataと仮定していましたが、この経験は私には困惑しています。何が起こっていますか?

それが助け場合、私はどこか

UIImage(name: ...) 

で画像を読み込む読み取り画像をキャッシュします。私はこれを確認しようとしましたが、空白を描きました。

私のコードは、これはスクロールのために、いくつかのメモリのバグ/機能(私はしたくないということ)である場合ので、私は思ったんだけど非常に簡単です。

もう一度、私は、メモリの備蓄を停止していますよ。何か案は?あなたが正しくそれをやっている

+0

イメージストアをバンドルに入れるか、サーバーからダウンロードするか? –

+0

@AmitSingh - 画像はassetsフォルダに保存されます。 – Shane

+0

アセットそのものがキャッシュで動作する理由 –

答えて

3

prepareForReuse方法では先に

+0

答えをありがとう。他の場所で画像を保存する方法がわかりませんが、これは完全に良い答えのようです。その間、私はちょうど私が推測するキャッシングで生きるでしょう。 – Shane

+1

ちょうどアップデート、私は、アプリケーションが実行されると、メモリのキャッシュを追跡し、メモリ警告が受信されると、キャッシュがダンプされます。説明にもう一度感謝します。 – Shane

0

あなたはセルの再利用のためのdequeueReusableCellWithReuseIdentifier(identifier:, forIndexPath:)方法を使用している場合、それは確かに、セルの再利用性を処理します。

イメージをバンドルからロードする方法は他にありません。メモリ内

若干の変更が反映されますが、その[OK]を、私は画像のキャッシュが追い出されたときに理解する機会があったことはありませんあなたのサブクラスUICollectionViewCell

func prepareForReuse() 
{ 
    super.prepareForReuse(); 
    cell.imageView.image = nil; 
} 
+0

リロードするたびにメモリ使用量が4MB増加するとは思えません。私は今それを実行し、クラッシュするときを参照してください。 – Shane

+0

メモリ使用量は650MBでピークに達しているようですが、おそらくすべての画像が循環しています。各画像が約200kBであり、そのうち約300画像があると考えると、まだ過度に見えます。 – Shane

0

行くことがあります。
コレクションビューのセルがデキューされ、再利用されます。それは、セルがスクリーンから出て行った直後よりも、ごみ箱に置かれます。セルが再び必要になった場合は、そのごみ箱から取り出してビュー階層に配置します(これはフライウェイトパターンと呼ばれます)。インスタンス化のコスト
は、このようにあなたは、画像を扱うときには、あなたのイメージがメモリに別の場所に格納されるのではなく、単に画像ビュー内で、セルが示されるたびに、新たな画像が古い画像を解放する必要が見る映像に渡されます。
これは、古いイメージへの参照を他の場所(キャッシュや配列など)に保存する場合には発生しません。
xcassetから画像を読み込むには、画像がキャッシュされることを意味するUIImage(name: ...)しか使用できません。たとえAppleがこのキャッシュがメモリ圧迫の状況で追い払われると言っても、アプリがクラッシュするのを避けるために、「時間内に」起こっていることは決して見たことがない。
何ができるxcassetフォルダに保存していないですが、どこでもあなたのプロジェクトでは、彼らはあなたのメインバンドルにロードされますこの方法で、あなたは一般的に使用することにより、ここから画像を読み込むことができます。

let path = NSBundle.mainBundle().pathForResource(<#T##name: String?##String?#>, ofType: <#T##String?#>) 
    let image = UIImage(contentsOfFile: path!) 

パスはオプションであることに注意してください。
ピクセル単位で同じビューサイズのイメージを使用してリソースを節約しようとすると、イメージの占有スペースは何も意味しません。メモリにロードされたときにその圧縮方法が決まります

+0

残念ながら、これは私のためには機能しませんでした。とにかくありがとう。 – Shane

+0

これを見て、コメントを考えました。 @Protonの言うことは、おそらくcellForItemAtIndexPathまたはcellForRowAtIndexPathを意味していましたが、実際には悪い考えではないかもしれません。彼があなたに伝えようとしていることは、非同期的に読み込む前にイメージビューを空にしようとすることです。 tldr:あなたのプレースホルダーとして「空のイメージ」を作るように。 – Happiehappie

関連する問題