2017-03-29 41 views
2

我有一個UICollectionView,其中我從相冊中加載用戶的所有照片。當用戶打開控制器時,所有照片都會被提取並存儲在一個數組中。點擊照片將創建一個黑色背景和該照片的更大版本的子視圖。再次點擊它將通過縮小轉換將其從超級視圖中移除。Swift - 從CollectionView中獲取相冊中的照片並保持分辨率

我的問題是,我不知道如何保持照片的原始大小以及保持較低的執行時間。將100張以上的照片加載到收藏中真的會傷害我的加載時間。

我不認爲有必要在更高的CGSize處獲取圖片,因爲我實際上希望它是單元格的邊界(每行有三個單元格)。

在0.20第二次執行時間

在3.0秒執行時間

我想實現的是保持一個非常300 300回到擷取圖片250由250返回擷取圖片執行時間短,清晰的縮略圖和該照片的高分辨率版本。我是否必須創建第二個線程才能在後臺加載所有內容,還是最好不要在我的viewDidLoad中調用我的函數?

var imageArray = [UIImage]() 

func getPhotosFromAlbum() { 

    let imageManager = PHImageManager.default() 

    let requestOptions = PHImageRequestOptions() 
    requestOptions.isSynchronous = true 
    requestOptions.deliveryMode = .highQualityFormat 

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

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

     if fetchResult.count > 0 { 

      for i in 0..<fetchResult.count { 

       imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in 

        self.imageArray.append(image!) 
       }) 
      } 
     } else { 
       self.collectionView?.reloadData() 
    } 
} 
+0

一般來說,如果你正在做一些繁重的處理,最好在後臺線程中這樣做,這樣你就不會鎖定你的主線程或使UI交互緩慢。當然,在這種情況下,請記住在主線程上執行任何UI更新。作爲您正在做什麼的替代方法,緩存縮略圖對於您想要做什麼而言是有意義的?如果是的話,那麼這可能是一個你可能想要探索的選項,因爲那樣你就會擁有大部分你需要的圖像,並且只需要獲取新圖像的縮略圖。 – Fahim

+0

謝謝!我添加了一個後臺線程來將圖片加載到我的collectionView中。我認爲它現在正常工作:-) –

+0

偉大的:)我已將我的評論轉換爲答案。如果有幫助,請將其標記爲「正確」。 – Fahim

回答

2

一般來說,如果你正在做一些繁重的處理,最好是做一個後臺線程,這樣你就不會鎖住你的主線程或使UI交互不暢。當然,在這種情況下,請記住在主線程上執行任何UI更新。