如何在ios中从手机中获取所有图像

Posted

技术标签:

【中文标题】如何在ios中从手机中获取所有图像【英文标题】:how to get all images from phone in ios 【发布时间】:2018-01-18 09:55:23 【问题描述】:

我想从手机中获取所有图像。在照片库中创建多个选择。我正在使用以下代码从手机中获取所有图像。它运行良好,但是当手机上有 1000 张图像时,需要更多时间来获取所有图像并显示在视图中。如何减少从手机获取所有图像的时间。

 // get all images from photos
    func getAllImagesFromPhotos() -> [Photos]?
    

        let imgManager = PHImageManager.default()
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: true)]

        let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)

        var allImages = [Photos]()

        for index in 0..<fetchResult.count
        
            let asset = fetchResult.object(at: index) as PHAsset
            imgManager.requestImage(for: asset, targetSize: CGSize(width:200,height:200), contentMode: .aspectFill, options: requestOptions, resultHandler:  (uiimage, info) in
                if let image = uiimage
                
                    allImages.append(Photos(image: image, selected: false))
                
            )
        

        return allImages
    

【问题讨论】:

加载所有图像需要很长时间是有道理的,如果你多解释一下你想要实现的目标,可能会有更好的方法来完成这项任务,你是什么试图通过获取所有图片来完成? 从照片中选择多张图片 我认为您将不得不围绕加载大量图像需要很长时间的想法来设计您的应用程序(它也会占用大量内存)。您真的需要同时加载所有这些吗? 是的,我想加载所有图片,比如whatsapp,以便用户一次上传多张图片 为什么要重新发明***呢,ios 有 UIImagePickerController 类可以做到这一点,它还会在用户滚动时加载图像,因此它不会立即加载所有内容,从而导致性能下降 【参考方案1】:

为了解决您的问题,您希望实际批量加载图像,一次加载 10 张图像并显示它们,当用户滚动更多时,加载下一批,等等。

如果您加载所有图像,那么当然会有不可避免的性能损失。

您想要使用的是 UIKit 中的 UIImagePickerController 类

Here 是苹果关于 UIImagePickerController 的文档。

如果您不想使用 UIImagePickerController,那么您必须一次加载一组较小的图像,并允许用户通过在选择视图上进一步滚动来“加载更多”。

编辑:多张图片选择

在阅读了您关于想要选择多个图像的评论后,很明显 UIImagePickerController 用于选择单个图像,但是,您不能在选择时将其关闭,并且当用户显示“图像已选择”时会显示吐司消息选择一个图像,而不是关闭视图,允许用户选择另一个图像,等等。如果用户再次选择相同的图像,您可以再次显示吐司说“图像已删除”,因为您可以验证图像是否有之前已经被选中了。

如果您不想实施该解决方法,您唯一的选择是批量加载大约 10 个图像的小块图像,或者按照我在原始答案中的建议。

但是,如果您真的不想自己实现,我建议使用 3rd 方库,例如 ELCImagePickerController,有数百个其他库可以做到这一点。

希望对你有帮助,祝你好运

【讨论】:

与其批量加载图像,不如使用 UITableView 或 UICollectionView(取决于它们的显示方式)并根据需要在后台批量单独下载。但是,正如您所说,如果您不想自己开发,可以使用 3rd 方库来进行这种图像缓存。 批处理在这个用例中更好,它会提供更流畅的滚动体验,因为表格视图肯定会同时显示多个图像,因此获取更多数据比获取它更好一个可能会导致开销,但是分批加载或一个一个加载仍然是正确的答案,而不是一次加载:) 所以你也没有错,这完全取决于所需的结果 如果您将图像的加载推送到后台线程并让它在完成后更新表格(例如)(假设单元格仍然可见),它根本不会减慢任何速度。在我们的应用程序中,我们的表格中可以有 10,000 种带有图像的产品,并且没有减速。显然,您在等待加载时有一个占位符图像,但无论哪种方式都是一样的。您还可以利用预取功能在图像可见之前开始加载图像。但是,正如您所说,这取决于应用程序的设置方式,超出了这个问题的范围。 绝对正确!,我在一个应用程序上做了类似的工作,它在你滚动时加载了无限的图像集,这一切都归结为正确配置 GCD,我还在你滚动时做了占位符缩略图它会等待图像在后台加载,然后再更新单元格中的图像,在我的例子中,我们确实获取了 50 个拇指以尽量减少与服务器的对话。但是直接在手机上应该没问题,我认为在旧设备而不是现代手机上会放慢速度 如果您正在与服务器通信,那么在这种情况下进行批处理确实更有意义。我正在考虑更多地通过电话直接访问。我们的应用程序会在后台下载它需要在本地存储的所有图像,因为它必须离线运行,尽管如果需要也可以根据要求下载功能,但我们的客户都没有使用过。幸运的是,这一切都适用于我们自己定制开发的云后端(使用 AWS),因此我们可以控制所有阶段。

以上是关于如何在ios中从手机中获取所有图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios中从UIImage设置图像

如何在swift中从UIImage获取图像扩展/格式

如何在 swift 4 中从图像选择器获取照片本地 url

如何在比 iOS 6.0 更早的 iOS 版本中从 UITextRange 获取矩形

如何在 IONIC 3 中从图库中获取或选择图像

在 iOS 中从文件中获取图像