2016-11-22 3 views
2

У меня есть табличное представление, которое действует как новостная лента. Ячейки заполняются из массива элементов новостей. Я получаю JSON с сервера, создаю элементы новостей из этого ввода и присоединяю их к своему массиву лент новостей. элемент новостей содержит заголовок, описание и строку imageurl.swift 3 iOS tableview datasource memory

В:

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 
    } 
    } 


} 

клетки из строк заполняются с моими данными newsfeeditem.

Но так как я сохраняю все свои новостные элементы внутри массива, использование памяти высока и выше для каждого дополнительного newsfeeditem. Я хочу, чтобы он работал с бесконечной прокруткой, как твиттер, поэтому мне интересно, как опытные разработчики решают эту проблему с памятью.

+2

пожалуйста, добавьте метод cellForRowAt как фрагмент кода –

+0

я добавил недостающий код! –

+1

pagination - хороший способ реализовать, если есть много фидов – Ccr

ответ

1

Ваша проблема в этих строках или где бы вы ни пытались удерживать UIImage внутри вашего массива, это действительно не рекомендуется и вызовет сбой из-за памяти, так как изображение очень больших данных и не рекомендуется сохранять его в вашей памяти с помощью UIImage внутри массив:

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

что вам нужно сделать, это в основном после извлечения изображения из URL, вы сохраните его в документы вашего приложения папки и сохранить имя или это путь, который может отчетливый ваш образ в cachedImage (только измените тип на строку или sth) и верните его из папки документа вашего приложения, когда вам нужно показать его в cellForRow

Flow: Fetch изображение -> сохранить на диск и сохраняются путь в массиве -> refetch с диска на пути в cellForRow

+1

Хорошо, я слышал, что могу достичь такого поведения с помощью SDWebImage, так? Но что, если у меня никогда не было изображения внутри ячейки, память повысилась бы даже с текстовыми сообщениями только для новостных лент? –

+1

Да, 'SDWebImage' поможет вам сделать весь шаг выше с небольшим кодом – Tj3n

+0

Я отредактировал свой ответ за несколько секунд до вашего ответа, извините –

Смежные вопросы