Search code examples
iosswiftphotophasset

How to fetch all images from custom Photo Album - Swift


How to fetch all images from custom Photo Album?

var fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
let allImages:PHFetchResult = PHAsset.fetchKeyAssetsInAssetCollection(albumList[index].collection, options: fetchOptions)

This code block is fetching just a few of them. Thanks.

-> albumList[index].collection 's type is PHAssetCollection


Solution

  • For Swift 4

    using this answer https://stackoverflow.com/a/28904792/4795651 edited a little for myself.

    import Photos
    
    
    func fetchCustomAlbumPhotos()
    {
        let albumName = "Album Name Here"
        var assetCollection = PHAssetCollection()
        var albumFound = Bool()
        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
            albumFound = true
        }
        else { albumFound = false }
        _ = collection.count
        photoAssets = PHAsset.fetchAssets(in: assetCollection, options: nil) as! PHFetchResult<AnyObject>
        let imageManager = PHCachingImageManager()
        photoAssets.enumerateObjects{(object: AnyObject!,
            count: Int,
            stop: UnsafeMutablePointer<ObjCBool>) in
    
            if object is PHAsset{
                let asset = object as! PHAsset
                print("Inside  If object is PHAsset, This is number 1")
    
                let imageSize = CGSize(width: asset.pixelWidth,
                                       height: asset.pixelHeight)
    
                /* For faster performance, and maybe degraded image */
                let options = PHImageRequestOptions()
                options.deliveryMode = .fastFormat
                options.isSynchronous = true
    
                imageManager.requestImage(for: asset,
                                                  targetSize: imageSize,
                                                  contentMode: .aspectFill,
                                                  options: options,
                                                  resultHandler: {
                                                    (image, info) -> Void in
                                                    self.photo = image!
                                                    /* The image is now available to us */
                                                    self.addImgToArray(uploadImage: self.photo!)
                                                    print("enum for image, This is number 2")
    
                })
    
            }
        }
    }
    
    func addImgToArray(uploadImage:UIImage)
    {
        self.images.append(uploadImage)
    
    }
    

    For Swift 2.1

    import Photos
    
    
    func FetchCustomAlbumPhotos()
    {
        var albumName = "SwiftAlbum"
        var assetCollection = PHAssetCollection()
        var albumFound = Bool()
        var photoAssets = PHFetchResult()
    
        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
        let collection:PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)
    
        if let first_Obj:AnyObject = collection.firstObject{
            //found the album
            assetCollection = collection.firstObject as! PHAssetCollection
            albumFound = true
        }
        else { albumFound = false }
        var i = collection.count
        photoAssets = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: nil)
        let imageManager = PHCachingImageManager()
    
        //        let imageManager = PHImageManager.defaultManager()
    
        photoAssets.enumerateObjectsUsingBlock{(object: AnyObject!,
            count: Int,
            stop: UnsafeMutablePointer<ObjCBool>) in
    
            if object is PHAsset{
                let asset = object as! PHAsset
                print("Inside  If object is PHAsset, This is number 1")
    
                let imageSize = CGSize(width: asset.pixelWidth,
                    height: asset.pixelHeight)
    
                /* For faster performance, and maybe degraded image */
                let options = PHImageRequestOptions()
                options.deliveryMode = .FastFormat
                options.synchronous = true
    
                imageManager.requestImageForAsset(asset,
                    targetSize: imageSize,
                    contentMode: .AspectFill,
                    options: options,
                    resultHandler: {
                        (image, info) -> Void in
                        self.photo = image!
                        /* The image is now available to us */
                        self.addImgToArray(self.photo)
                        print("enum for image, This is number 2")
    
                })
    
            }
        }
    }
    
    func addImgToArray(uploadImage:UIImage)
    {
        self.images.append(uploadImage)
    
    }