ios - 将图像保存为本地文件或二进制数据 IOS

标签 ios uitableview swift core-data

对于这个问题,有很多答案,但我不明白它们之间的一些具体区别,所以我会发布我需要的,然后再提问。

关于我的项目: 我的图像添加了高斯模糊和类似的效果,内存优化得很好。当我保存图像时,最后一步是在 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/

相关文章:

iOS如何实现官方分享功能

ios - 如何在多个场景中使用 AVAudioPlayer 暂停游戏中的背景音乐

ios - 无法在Xcode6中设置UITableViewCell,因为“自动属性合成不会合成属性..”警告

ios - 在 UITableViewCell 中未检测到点击手势

Swift - 通话中的额外参数

ios - Swift - 从 CoreData 加载/保存会生成重复条目

ios - 你如何以编程方式从 View Controller 中画一条线?

ios - UIWebView FinishLoad/检测问题

ios - 使用 AutoLayout 约束隐藏 UIView

iphone - 带有 subview 的 UITableViewCell 不被重用