【问题标题】:swift 3 iOS tableview datasource memoryswift 3 iOS tableview 数据源内存
【发布时间】:2017-04-05 23:44:18
【问题描述】:

我有一个用作新闻源的表格视图。这些单元格是从一组新闻源项中填充的。我从服务器获取 JSON,从该输入创建新闻源项目并将它们附加到我的新闻源数组。新闻提要项包含标题、描述和 imageurl 字符串。

在:

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 一样进行无休止的滚动,所以我想知道有经验的开发人员是如何解决这个内存问题的。

【问题讨论】:

  • 请将 cellForRowAt 方法添加为代码 sn-p
  • 我已经添加了缺失的代码!
  • 如果提要很多,分页是一种很好的实现方式
  • 我也想过这个问题。什么样的分页?页面索引号看起来已经过时了,所以我想到了 twitter,当你到达底部时它们会加载新的推文,但是你可以在不加载的情况下再次向上滚动,这意味着它们将数据保存在某个地方,我想知道将所有推文保存在内存中会我猜应用程序崩溃了。
  • 普通数据可以保存在数组中。但是可以获取和设置图像等信息。 Kingfishers 和 alamofireImage 也可以帮助缓存它。\

标签: ios swift uitableview caching memory-management


【解决方案1】:

您的问题出在这一行或您尝试将UIImage 保存在数组中的任何位置,这确实不建议这样做,并且会由于内存而导致崩溃,因为图像是非常大的数据,不建议将其保留在您的 RAM 中UIImage 内部数组:

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

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

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

【讨论】:

  • 好的,我听说我可以使用 SDWebImage 达到这种行为,对吗?但是,如果我在单元格中没有图像怎么办,即使只有文本新闻提要项,内存也会增加,不是吗?
  • 是的,SDWebImage 将帮助您用很少的代码完成上述所有步骤
  • 我在你回答前几秒钟编辑了我的答案,对不起
  • 因为内存不是来自单元格,而是来自数组,它是你的数组,它会产生这种行为并提高你的记忆力,所以单元格只是显示你的数组中保存的任何内容
  • 我怎样才能让数组中的项目只在需要时才加载到内存中?
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多