2017-08-06 17 views
0

firebaseから画像を取得し、配列に追加した後、それらをURLセッションのコレクションビューに配置する非常に簡単なiOSアプリケーションがあります。 1つの問題、つまり画像のコレクションビューを保持するビューは、メインビューとは別のビューです。そのため、ユーザーがビューをクリックするたびに、メモリの使用状況がわかります。クリックすると、メモリは変更されません。ビューがプッシュされるたびに、メモリ使用量が上昇し続けます。私はメインビューでURLセッションを行ったときにこの問題を経験したことはありませんが、今は別のビューで問題があります。イメージをつかむためにURLから画像をダウンロードするときにNsurlsessionメモリリークが発生する

:ここに画像をダウンロードするための私のコードがある

 let ref = firdatabase.dadatabase.reference 
ref.child("Pages").queryOrderedByKey.observeSingleEvent(type: .value, snapshot in 

if let pages = snapshot.value as? [String : AnyObject] { 
for (_, vale) in pages { 
let newPage = page() 
If let url = vale["url"] as? String { 
newpage.url = url 
pagers.append(new page) 
} 
} 
collection view.reloadData() 

)} 

nsurlsession:

if pagers.count != 0 { 
    let post = pagers[indexPath.row].url 
     let url = URL(string: post!) 
     let session = URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 
      if let errer = error { 
       print(errer.localizedDescription) 
      } 

      DispatchQueue.main.async { 
       cell.imageViewPage.image = UIImage(data: data!) 
      } 
     })session.resume() 



    } 
    return cell 

が今ここでの問題はしかしある、メモリが上昇し、これまで落としていない続けます。

enter image description here

私はあなたをbefore.Thank方法、およびこの問題を持っていたことがない見当がつかないので、私は本当にこの問題の解決策を見つけるためにあなたの助けを必要としています。私はこの問題の簡単な解決策があることを願っています。私はあなたはそれがメモリを避けるために完了すると、あなたのセッションのタスクを無効にする必要があると思う

+0

漏洩したインスタンスを探すために漏出計器を実行します。 –

答えて

0

urlSession.invalidateAndCancel() 
+0

セッションの後にUrlSession.invalidateAndCancel(セッション)を実行しようとしましたが、これによりエラーが発生します –

+0

エラーは何ですか? –

+0

インスタンス 'invalidateAndCancel'は 'URLSession'タイプでは使用できません。代わりにこのタイプの値を使用することを意味しましたか? –

1

を漏らすあなたがメモリリークを持っていることは明らかではありません。メモリ使用量が増えただけで、メモリリークが発生したわけではありません。

リモートURLからイメージをロードして配列に保存すると、メモリ使用量が増加します。

ビューコントローラを離れて配列を破棄してメモリ使用量が元に戻った場合、メモリリークは発生しません。

コードは画像をテーブルビュー/コレクションビューのセルにインストールしていますが、どこにも保存しないことに注意してください。つまり、ユーザーがオフスクリーンでセルをスクロールしてスクロールして戻すと、再びダウンロードされます。

代わりに、イメージをファイルとしてディスクに保存するコードを書くことをお勧めします。ファイルURLのハッシュを作成し、それをファイル名として使用することができます。ファイルが既にディスク上にあるかどうか(おそらくあなたのアプリのキャッシュディレクトリにあるかどうか)をチェックし、もしそうならディスクからロードする。そうでない場合は、URLSessionダウンロードオブジェクトを使用し、ダウンロードが完了したらキャッシュディレクトリのファイル名にハッシュファイルを保存し、ターゲットセルにインストールします。

+0

よく私は表示コントローラを却下した後、私は決してアレイをクリアしない、私は思っていますなぜ私はビューを閉じるときにメモリをクリアしません –

+0

誰がアレイを所有していますか?質問を編集して、イメージの配列を管理するコードを表示し、使用しているビューコントローラのライフサイクルを説明する必要があります。 –

+0

ねえ男私は質問を更新しました –

関連する問題