当前位置: 首页 > 面试题库 >

Swift:异步加载和显示照片

郝峰
2023-03-14
问题内容

我正在努力解决从iPhone到iPhone显示相册的问题collectionView

如果某人在画廊内有50张照片,则一切正常。问题是,当某人有数千张照片时,图库会加载10秒钟,这对我的应用程序不利。
当我从Facebook加载图像时,会发生相同的问题。该应用程序正在等待下载所有照片,然后显示出来。我想在加载过程中一一显示图像,而不是等待它全部加载。

我知道我应该使用DispachQueue并且确实使用过,但是有一些我看不到的错误。
这是我用来从iPhone图库中获取图像的代码:

func grapPhotos() {
    let imgManager = PHImageManager.default()
    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = true
    requestOptions.deliveryMode = .highQualityFormat
    let fetchOptions = PHFetchOptions()

    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    if let fetchResulat : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) {

        if fetchResulat.count > 0 {

            for i in 0..<fetchResulat.count {

                imgManager.requestImage(for: fetchResulat.object(at: i), targetSize: CGSize(width: 200, height:200), contentMode: PHImageContentMode.aspectFill, options: requestOptions, resultHandler: {
                    (image, eror) in

                    self.imageArray.append(image!)

                    DispatchQueue.main.async {
                        self.collectionView.reloadData()
                    }
                })
            }
        } else {

            print("You have no photos")
            self.collectionView.reloadData()
        }
    }
}

和显示它们的代码collectionView

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return imageArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "galleryCell", for: indexPath) as! GalleryCollectionViewCell

        let image = self.imageArray[indexPath.row]

        DispatchQueue.main.async {
            cell.gelleryImages.image = image
            }

    return cell
}

我的Facebook课程可能存在相同的问题,因此,我将非常感谢您的帮助。


问题答案:

您需要将fetchResult属性添加到集合视图控制器,然后在viewDidLoad方法中获取图像Assets。

var fetchResult: PHFetchResult<PHAsset> = PHFetchResult()

func fetchAssets() {
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
}

override func viewDidLoad() {
    super.viewDidLoad()
    fetchAssets()
}

下一步是扩展UIImageView,以请求图像数据在完成时异步设置其图像。

func fetchImage(asset: PHAsset, contentMode: PHImageContentMode, targetSize: CGSize) {
    let options = PHImageRequestOptions()
    options.version = .original
    PHImageManager.default().requestImage(for: asset, targetSize: targetSize, contentMode: contentMode, options: options) { image, _ in
        guard let image = image else { return }
        switch contentMode {
        case .aspectFill:
            self.contentMode = .scaleAspectFill
        case .aspectFit:
            self.contentMode = .scaleAspectFit
        }
        self.image = image
    }
}

现在,您可以一次在集合视图cellForItemAt方法中获取一张图像:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CollectionViewCell
    let asset = fetchResult.object(at: indexPath.row)
    cell.imageView.fetchImage(asset: asset, contentMode: .aspectFit, targetSize: cell.imageView.frame.size)
    return cell
}

不要忘记为numberOfItemsInSection方法返回fetchResult计数。

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return fetchResult.count
}

Sanple项目



 类似资料:
  • 本文向大家介绍jQuery Ajax 加载数据时异步显示加载动画,包括了jQuery Ajax 加载数据时异步显示加载动画的使用技巧和注意事项,需要的朋友参考一下  ajax加载后台数据就不说的那么细了。 看下面代码首先前台上放置代码 在js脚本文件中首先把这个图片动画隐藏 代码如下 然后异步ajax提交请求代码如下 ..................... 注意: async: true, 当

  • 问题内容: 我有一个用代码创建的(没有): 在另一堂课中,我有一个扩展方法来下载图像异步: 我在其他地方使用了此功能并正常工作,根据我的日志,我了解到下载的图像没有问题(渲染单元时),下载图像后,单元UI未更新。 我也尝试使用像Haneke这样的缓存库,但是问题存在并且没有改变。 请帮助我理解错误 谢谢 问题答案: 设置图像后,您应该致电 编辑:从改正为

  • 我正在尝试构建一个应用程序,该应用程序在URL的ListView中显示.jpg,.png,.webm和.gif(也是动画)。我通过 JSON 请求收到 URL。我设法通过Volley接收JSON响应和Image / WebM / Gif URL,并尝试通过NetworkImageView中的ImageLoader显示它。JPG和PNG工作正常,但WebM和GIF无法播放。WebM甚至不会像Gif那

  • 问题内容: 我正在寻找一种在调用异步服务时自动显示和隐藏“正在加载”消息的方法,所以不要这样做: 我只想这样做,但是仍然在完成时显示和隐藏消息。 简而言之,我想更改异步调用的行为。感谢您提出的所有建议。 丹尼尔 问题答案: 您可以将调用本身包装在处理显示加载消息的对象中,也许对错误或其他原因重试几次。像这样: 要进行呼叫,请执行以下操作: 您可以使用代码扩展它,以检测花费很长时间的呼叫并显示某种繁

  • 问题内容: 我正在使用JQuery的几个插件,自定义窗口小部件和其他一些库。结果,我有几个.js和.css文件。我需要为网站创建一个加载器,因为加载需要一些时间。如果可以在导入所有内容之前显示加载程序,那就太好了: 我找到了一些教程,这些教程使我能够异步导入JavaScript库。例如,我可以做类似的事情: 由于某种原因,当我对所有文件执行相同操作时,页面将无法正常工作。我已经尝试了很长时间,试图

  • 本文向大家介绍异步加载和延迟加载有什么区别?相关面试题,主要包含被问及异步加载和延迟加载有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 异步加载: 浏览器会在解析HTML的同时进行加载javascript,一旦该javascript加载完毕,浏览器会暂停HTML的加载并执行javascript,之后继续HTML的加载。 延迟加载: 同样是解析HTML的同时进行加载javascript,但是