iosswiftuiscrollviewphotolibrary

Swift - how to get last taken 3 photos from photo library?


I need to get and show last taken 3 photos from photo library on viewDidload event without any clicks.

After this step, I should get other photos 3 by 3 when I scroll the ScrollView.

Do you know the proper way to do this with swift? Thanks.

Sample


Solution

  • Here's a solution using the Photos framework available for devices iOS 8+ :

    import Photos
    
    class ViewController: UIViewController {
    
        var images:[UIImage] = []
    
        func fetchPhotos () {
            // Sort the images by descending creation date and fetch the first 3
            let fetchOptions = PHFetchOptions()
            fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]
            fetchOptions.fetchLimit = 3
    
            // Fetch the image assets
            let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
    
            // If the fetch result isn't empty,
            // proceed with the image request
            if fetchResult.count > 0 {
                let totalImageCountNeeded = 3 // <-- The number of images to fetch
                fetchPhotoAtIndex(0, totalImageCountNeeded, fetchResult)
            }
        }
    
        // Repeatedly call the following method while incrementing
        // the index until all the photos are fetched
        func fetchPhotoAtIndex(_ index:Int, _ totalImageCountNeeded: Int, _ fetchResult: PHFetchResult<PHAsset>) {
    
            // Note that if the request is not set to synchronous
            // the requestImageForAsset will return both the image
            // and thumbnail; by setting synchronous to true it
            // will return just the thumbnail
            let requestOptions = PHImageRequestOptions()
            requestOptions.isSynchronous = true
    
            // Perform the image request
            PHImageManager.default().requestImage(for: fetchResult.object(at: index) as PHAsset, targetSize: view.frame.size, contentMode: PHImageContentMode.aspectFill, options: requestOptions, resultHandler: { (image, _) in
                if let image = image {
                    // Add the returned image to your array
                    self.images += [image]
                }
                // If you haven't already reached the first
                // index of the fetch result and if you haven't
                // already stored all of the images you need,
                // perform the fetch request again with an
                // incremented index
                if index + 1 < fetchResult.count && self.images.count < totalImageCountNeeded {
                    self.fetchPhotoAtIndex(index + 1, totalImageCountNeeded, fetchResult)
                } else {
                    // Else you have completed creating your array
                    print("Completed array: \(self.images)")
                }
            })
        }
    }