我有一个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 回答
您的问题出在这行或者您尝试在数组中保存
UIImage
的地方,这实际上是不建议的,并且会因内存导致崩溃,因为图像是非常大的数据,并且不建议使用UIImage
内部数据将其保留在RAM中:self.feed!.items[indexPath.row].cachedImage = image!
您需要做的是基本上从URL获取图像后,将其保存到您的应用程序_617263的路径,可以在
cachedImage
中区分您的图像(只需将类型更改为字符串或sth)并在您的应用程序文档文件夹中重新获取它需要在cellForRow
中显示流:获取图像 - >保存到磁盘并在数组中保留路径 - >从磁盘重新获取,路径在
cellForRow
中