2016-11-22 10 views
2

私はニュースフィードとして機能テーブルビューを持っています。セルは、ニュースフィード項目の配列から埋められます。サーバーからJSONを取得し、その入力からニュースフィード項目を作成し、それらをニュースフィード配列に添付します。ニュースフィード項目には、タイトル、説明、およびイメージ文字列が含まれています。行からの細胞は私のnewsfeeditemデータで埋めます迅速な3 iOSのテーブルビューのデータソースメモリ

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var cell = tableView.dequeueReusableCell(withIdentifier: "ImageFeedItemTableViewCell1", for: indexPath) as! ImageFeedItemTableViewCell 
    var item = self.feed!.items[indexPath.row] 
    if (item.messageType == 1){ 
    cell = tableView.dequeueReusableCell(withIdentifier: "ImageFeedItemTableViewCell1", for: indexPath) as! ImageFeedItemTableViewCell 
    cell.title.text = item.title 
    cell.description.text = item.contentText 

    if (item.imageURL as URL == URL(string: "noPicture")!) 
    { 
     cell.picture.image = UIImage(named:"empty") 
    } 
    else{ 

    if (item.cachedImage == UIImage(named:"default-placeholder")){ 
    let request = URLRequest(url: item.imageURL as URL) 
    cell.picture.image = item.cachedImage 
    cell.dataTask = self.urlSession.dataTask(with: request, completionHandler: { (data, response, error) -> Void in 
     OperationQueue.main.addOperation({() -> Void in 
      if error == nil && data != nil { 
       let image = UIImage(data: data!) 
       if (image != nil){ 
       self.feed!.items[indexPath.row].cachedImage = image! 
       } 
       cell.picture.image = image 


      } 

     }) 

    }) 
     cell.dataTask?.resume() 
    }else 
    { 
     cell.picture.image = item.cachedImage 
    } 
    } 


} 

:で

しかし、私は、アレイ内のすべての私のnewsfeeditemsを維持するので、メモリ使用量が高く、各追加newsfeeditemについてgehts高いです。私はそれがツイッターのような無限のスクロールで動作するようにしたいので、経験豊富な開発者がどのようにこのメモリ問題に取り組んでいるのだろうかと思います。

+2

にコードスニペット私は行方不明のコードを追加した –

+0

としてcellForRowAtメソッドを追加してください! –

+1

ページネーションは、私もそのことについて考えてフィード – Ccr

答えて

1

あなたの問題は、この行であるか、あなたは、アレイ内のUIImageを保持しようとするところはどこでも画像がUIImageとあなたのRAMでそれを持続することをお勧め非常に大きなデータとはないので、これは本当にお勧めできませんし、原因メモリにクラッシュが発生します配列内:ちょうど(あなたがする必要がどのような

self.feed!.items[indexPath.row].cachedImage = image!

は、基本的には、後に、URLからイメージを取得されますが、アプリケーションのドキュメントフォルダに保存して名前を保存するか、それがcachedImageであなたのイメージすることができます明確なパスですタイプを文字列またはsthに変更する)、アプリを表示する必要があるときにアプリのドキュメントフォルダからそのタイプを再取得するcellForRow

フロー:画像を取得 - > [ディスクに保存して、配列内のパスを存続 - >再フェッチをディスクからのパスでcellForRow

+1

私はSDWebImageを使用してその動作に到達できると聞いていましたが、それは正しいですか?しかし、もし私がセルの中にイメージを持っていなければ、メモリはテキストでさえも上昇するでしょう。 –

+1

はい、 'SDWebImage'はあなたが少しのコード私はあなたが – Tj3n

+0

で上記のすべてのステップを行うのに役立ちますあなたのメモリを引き上げると、セルはあなたの配列に保持されているものを表示しています –