对于这个问题,有很多答案,但我不明白它们之间的一些具体区别,所以我会发布我需要的,然后再提问。
关于我的项目:
我的图像添加了高斯模糊和类似的效果,内存优化得很好。当我保存图像时,最后一步是在 UITableView
上显示它们。图像的数量将从 30 到 60。如果我捕获高质量的图像,内存将高达 200 MB,因此 UITableView
当然会添加额外的内存。 (将会崩溃!)。此时我将图像保存在 CoreData
中,在 UITableView 之前我生成缩略图以减少内存。
我的问题:
与其使用 CoreData
,不如在本地保存图像?它对 UITableView
有什么帮助以及它对内存有何影响?
谢谢。
最佳答案
感谢您提供的要点,关于如何以更简洁的方式实现它,我有一些建议。 这当然是未经测试的代码,只能用作灵感。
想法是让 cellForRowAtIndexPath 更清晰,并尝试使用已设置数据的模型列表。这样 UITableViewDataSource 只读取现有数据。这保证了良好的性能。所以在你下载了你的数据之后,尝试制作它的模型,你稍后在你的 UITableViewDataSource 方法中使用,比如“cellForRowAtIndexPath”和“numberOfRowsInSection”
下面未经测试的代码 中真正需要清理的是如何/何时根据下载的数据创建模型。您能否同时下载所有数据,然后将所有对象转换为模型,然后重新加载表格 View ?
class MyViewController: UIViewController {
// The UITableViewDataSource class contains a list TimeLineCellModels, which is used in numberOfRowsInSection
var models: [TimeLineCellModel] = []
//MARK: - Private Methods
func addModel() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
var imageDataFinal = task.document
var finalImage = UIImage(data: imageDataFinal as NSData)
let size = CGSizeApplyAffineTransform(finalImage!.size, CGAffineTransformMakeScale(0.2, 0.2))
let hasAlpha = false
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen
UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
finalImage!.drawInRect(CGRect(origin: CGPointZero, size: size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
var model = TimeLineCellModel(task.documentName, documentDateString: task.createdOn, documentImage, scaledImage)
self.models.append(model)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
})
}
private func modelForIndexPath(indexPath: NSIndexPath) -> TimeLineCellModel {
return models[indexPath.row]
}
//MARK: - UITableViewDataSource Methods
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! TimeLineCell
let model = modelForIndexPath(indexPath)
cell.updateWithModel(task)
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let rowCount = models.count
return rowCount
}
}
class TimeLineCell: UITableViewCell {
@IBOutlet weak var documentName: UILabel!
@IBOutlet weak var documentDate: UILabel!
@IBOutlet weak var documentImage: UIImageView!
func updateWithModel(model: TimeLineCellModel) {
documentImage.image = model.documentImage
documentName.text = model.documentName
documentDate.text = "Created On: \(model.documentDateString)"
}
}
class TimeLineCellModel {
var documentName: String
var documentDateString: String
var documentImage: UIImage
init(documentName: String, documentDateString: String, documentImage: UIImage) {
self.documentName = documentName
self.documentDateString = documentDateString
self.documentImage = documentImage
}
}
关于ios - 将图像保存为本地文件或二进制数据 IOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30638615/