ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ios - Swift] PHCachingImageManager 사용하기
    ios 2020. 12. 14. 09:43

     

     

     

    이번 글에서는 포토 라이브러리를 만들어볼 예정입니다.

     

    포토 라이브러리에 접근하는 방법은 PHImageManager, PHCachingImageManager 두 가지이며 사용방법은 동일합니다.

     

    PHCachingImageManager를 사용하는 것이 이미지를 빨리 가져올 수 있으므로  PHCachingImageManager을 사용하도록 하겠습니다.

     

     

    let imageManager:PHCachingImageManager = PHCachingImageManager()
    var imageFetch: PHFetchResult<PHAsset>?

    공유 이미지 관리자 개체와 사진에 대한 메타데이터를 관리할 수 있는 리스트를 선언해 주도록 합니다.

     

    PHAsset 에는 사진이 아닌 메타데이터만을 가지고 있습니다.

     

     

     

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

    viewDidLoad에서 호출할 함수이며 공유 이미지를 파일 생성 날짜순 정렬해 검색하는 부분입니다.

     

    이제 collectionView를 이용해 이미지를 요청하도록 하겠습니다. 

     

     

    extension PhotoViewController: UICollectionViewDataSource {
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return imageFetch?.count ?? 0
        }
        
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell", for: indexPath) as! PhotoCollectionViewCell
        
            let width = (collectionView.frame.width - 3) / 3
            let size = CGSize(width: width, height: width)
            
            if let asset:PHAsset = self.imageFetch?.object(at: indexPath.row) {
                self.imageManager.requestImage(for: asset,
                                               targetSize: size,
                                               contentMode: .aspectFill,
                                               options: nil) { (image, error) in
                    cell.imageView.image = image
                }
            }
            return cell
        }
    }
    

    공유 이미지 관리자 개체에 메타데이터에 해당하는 이미지를 요청하도록 합니다.

     

    이때 옵션은 nil 이라고 했지만 PHImageRequestOption 을 사용하여 아래와 같은 옵션을 추가로 사용할 수 있습니다.

                

    isSynchronous = true : 이미지 요청을 동기로 처리

    requsetOptions.deliveryMode = .fastFormat : 이미지 품질

    requsetOptions.resizeMode = .fast : none:조정안함, fast:기존과 비슷하거나 큼, exact:일치하도록

     

    댓글

Designed by Tistory.