PhotoKit질문 + 자괴감

안녕하세요. 매번 질문만 올려서 뭔가 죄송하네요…

다름이 아니라 edwith iOS 부스트 코스를 수강중입니다. 프로젝트 중 하나가 PhotoKit을 사용한 앱을 만드는 것인데 처음부터 어디로 파고 들지 아예 생각을 못하겠어서 질문드립니다. .

일단 뷰1은 요렇게 생겼습니다.

제가 생각한 방법은
일단 UICollectionView를 하나 만들고 그 안에 UIImageView, UILabel 두 개가 들어간 커스템 셀을 만듭니다.
여기까지는 괜찮습니다.

근데 이 뷰의 요구사항이
" 1.애플리케이션 처음 진입 시 사진 라이브러리 접근권한이 없다면 사진 라이브러리에 접근 허용 여부를 묻습니다.
2.수락 시 디바이스의 사진에 접근하여 기본 앨범(카메라롤, 즐겨찾기, 셀피 등)과 사용자 커스텀 앨범을 가져옵니다.
3.비수락 시 컬렉션뷰에 사진이 나타나지 않으며, 오류로 인한 애플리케이션 강제종료가 되지도 않습니다."
이렇게 있습니다.

그 중에 2번이 완전히 감이 없네요… 일단 궁금한 것이 기본앨범 + 사용자 커스텀 앨범과 썸네일을 가져오는 부분입니다.

smartAlbums: PHFetchResult"PHAssetCollection" (기본앨범)
userCollections: PHFetchResult"PHCollection"(커스텀앨범)

"는 꺾쇠 입니다. <>가 이상하게 입력이 안되네요
일단 이 두 녀석으로 뭔가를 해야될것 같은 feel은 있습니다.

일단 requestCollection( )이라는 함수를 하나 만듭니다.

그 안에다가
func requestCollection( ) {
let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: “creationDate”, ascending: true)]
smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
userCollections = PHCollectionList.fetchTopLevelUserCollections(with: nil)
PHPhotoLibrary.shared().register(self)
} 이렇게 만들어 줍니다.

이 코드도 애플 개발자 사이트에 있는 예시보고 쓴겁니다. ㅠㅠ

PHFetchResult에 각 앨범의 sort결과를 저장해주는 일은 하는 것 같네요.

그리고 viewDidLoad( )가 호출되서 photoAurhorizationsStatus가 authorized되면 저 requestCollection이라는 놈을 호출해서 cell에 뿌려줄 일을 준비 합니다.
문제는

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

이 함수 안에서 어떻게 앨범과 이미지를 불러드릴지 모르겠네요.

제일 궁금한 것이 저 함수안에서 어떻게 위의 smartAlbums와 userCollections 변수를 셀안에 넣어야할까요? ㅠㅠ 아직 썸네일은 생각도 못했습니다.

PhotoKit이 예상밖으로 매우 복잡하네요 애플 문서봐도 잘 이해안가고 부스트캠프 동영상 돌려봐도 영… 이해가 안갑니다… 구글링해도…ㅠㅠㅠ

혹시 PhotoKit관련해서 잘 아시는 분은 댓글부탁드립니다! 감사합니다!

좋아요 1

포토킷 보다 델리게이트 패턴과 프로토콜에 대해서 다시 개념을 잡아야 할 것 같다는 느낌 아닌 느낌이 드는군요. ㅎㅎ

그나저나 edwith. ㅎㅎ 오래간만에 듣는 이름이네요. 요즘에도 야곰님이 하시나 모르겠군요. ㅎㅎ

거기 objc 수업이 그리 좋다고 소문이. ㅋㅋㅋㅋㅋ 후다닥~ :smile:

좋아요 2

아 ㅋㅋ 야곰님이 가르쳐주십니다. 델리게이트는 알다가도 모르겠네요 ㅠㅠ 계속 공부해보겠습니다.

좋아요 2

혹시 실례가 안된다면 제가 쓴 글 중 어느 부분에서 개념을 다시 잡아야 한다는 느낌 아닌 느낌이 드셨나요? 그 부분부터 파고 들어가면서 다시 델리게이트 패턴을 공부해 보겠습니다. :grinning:

좋아요 1

어려운 질문이네요… ^^;;

일단, 사용자의 confirm 을 받는 부분

  • 어떻게 결과를 받아야 할까 라는 질문을 하고 있었고… 그에 대한 애플의 ‘표준’ 해답은 delegate pattern 입니다.

왜 delegate 인가

  • PhotoKit 문서를 보지 않았지만,

에서 PHAssetCollection 과 PHCollection 은 protocol 을 의미하고, 일반적으로 delegate 패턴을 타고, PhotoKit 이 메시지를 받을 대상을 지정해서 그쪽에서 받도록 해주는 구조입니다.

protocol 은 던져주는 메시지가 정의된 일종의 선언부 이지요.

UITableView 와 UITableViewDelegate, UITableViewDataSource 혹은 현재 과제로 진행하는
UICollectionView 와 UICollectionViewDelegate, UICollectionViewDataSource 와 같은 구조 입니다. :smile:

앱을 어떻게 죽게 하지 않게 하는가

  • 다른말로 표현하면, 어떻게 호출되는 구조 이길래 앱이 죽는가… 이겠죠? :smile:

그래서, 먼저 델리게이트 패턴에 대해서 생각해 보고, 글에 적지는 않았지만 기존 ViewController 동작 구조에서 어떻게 ‘적절히’ 처리할 것인지에 대해서 생각해보라는 마음에 적었던 겁니다. :smile: 아마, 야곰님도 비슷한 생각으로 문제를 제시했을거라 생각해요.

그래서 어떻게…?

  • 순서와 타이밍에 대해서 한번 더 생각해보시고…
  • 화면에 보여줄 데이터 준비 후, 화면 리프레시~ 라는 흐름을 조금 더 고민해보고
  • ViewController 프로세스를 기억하면서
  • delegate pattern 을 살짝 뿌리면…?

어떨까… 싶습니다. :smiley:

좋아요 3

ㅠㅠㅠ 자세한 답변 너무 감사드립니다!! 계속 파보겠습니다~ :smile:
근데 혹시 리뷰어님이신가요?? 완전 리뷰어님 말투같습니다 :joy:

좋아요 1

리뷰어가 누군지 잘 모르겠네요. ^^; 전 아닙니다~!

좋아요 2

아 제 뜻은 mocona님의 답변이 매우 자세해서 꼭 부스트코스에서 프로젝트 제출하면 리뷰해주시는 리뷰어 같다는 뜻이였습니다! ㅎㅎ

좋아요 1