首页 文章

swift 3 iOS tableview数据源内存

提问于
浏览
2

我有一个tableview作为新闻源 . 这些单元格由一系列新闻源项目填充 . 我从服务器获取JSON,从该输入创建新闻源项目并将它们附加到我的新闻源阵列 . 新闻源项目包含 Headers ,描述和图像字符串 .

在:

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数据 .

但是,由于我将所有新闻源都保留在一个阵列中,因此每增加一个新闻源,内存使用量就会很高,并且会更高 . 我希望它能像twitter一样无休止地滚动,所以我想知道经验丰富的开发人员如何解决这个内存问题 .

1 回答

  • 1

    您的问题出在这行或者您尝试在数组中保存 UIImage 的地方,这实际上是不建议的,并且会因内存导致崩溃,因为图像是非常大的数据,并且不建议使用 UIImage 内部数据将其保留在RAM中:

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

    您需要做的是基本上从URL获取图像后,将其保存到您的应用程序_617263的路径,可以在 cachedImage 中区分您的图像(只需将类型更改为字符串或sth)并在您的应用程序文档文件夹中重新获取它需要在 cellForRow 中显示

    流:获取图像 - >保存到磁盘并在数组中保留路径 - >从磁盘重新获取,路径在 cellForRow

相关问题