首页 > 解决方案 > 显示相册中最新 10 张图片的最佳方式是什么?

问题描述

这就是我正在做的事情。用户选择他们想要使用的相册以及他们想要从相册中使用的图像数量。例如 15 张图片。当用户导航到某个控制器视图时,它将显示第一个图像,然后单击下一步它将显示下一个图像....直到达到 15。

我正在使用PhotoHelper库来获取图像

var userAlbumArray: [PhotoAlbum] = []
var options = PhotosHelper.defaultImageFetchOptions
options.deliveryMode = .FastFormat

var fetchOptions = PhotosHelper.FetchOptions()
fetchOptions.count = 15

PhotosHelper.getImagesFromAlbum("Album Name", options: options, fetchOptions: fetchOptions, completion: { result in
    switch result {
    // When options.synchronous is set to true an array of all assets is fetched.
    case .Assets(let images):
        ()
    // when options.synchronous is set to false the system fetches one asset at a time calling this completion handler multiple times
    case .Asset(let image):
        let alb = PhotoAlbum(title: album.localizedTitle ?? "", thumbnail: image)
        userAlbumArray.append(alb)
    case .Error:
        ()
    }
})
import Foundation
import UIKit

struct PhotoAlbum {

    var title: String
    var thumbnail: UIImage?

    init(title: String, thumbnail: UIImage?) {
        self.title = title
        self.thumbnail = thumbnail
    }
}

由于图像是异步加载的,我的想法是PhotoAlbum为每个图像创建一个对象,并将其添加到 App 初始加载时的数组中。然后将数组保存到UserDefaults用户获得视图控制器后,它将从 UserDefaults 中获取图像。

我尝试将其保存到 UserDefault 但我无法做到。可能是因为 UIImage。

我是正确地接近这个还是有人有更好的建议?

标签: swift

解决方案


我创建了这个函数来从相册中获取 x 数量的图像:

    public static func getImages(albumName: String, number_of_images: Int = 1) -> [PHAsset]{
        var assets: [PHAsset] = []
        var assetCollection = PHAssetCollection()
        var photoAssets = PHFetchResult<AnyObject>()
        let fetchOptions = PHFetchOptions()

        fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
        let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

        if let firstObject = collection.firstObject{
            // found the album
            assetCollection = firstObject
        }

        let options = PHFetchOptions()
        options.fetchLimit = number_of_images
        photoAssets = PHAsset.fetchAssets(in: assetCollection, options: options) as! PHFetchResult<AnyObject>

        photoAssets.enumerateObjects{(object: AnyObject!,
            count: Int,
            stop: UnsafeMutablePointer<ObjCBool>) in

            if object is PHAsset{
                let asset = object as! PHAsset
                assets.append(asset)
            }
        }

        return assets
    }

推荐阅读