TLPhotopicker, PHAsset, like a Facebook
iOS 오픈소스를 처음으로 제작해본 제작후기를 남겨본다.
기술적인 부분보다는 오픈소스를 제작하면서 느꼇던 것들에 대한 내용을 적어보려 한다.
https://github.com/tilltue/TLPhotoPicker
소스는 위의 주소에서 :D
올해 초 회사에서 swift2 -> swift 3로 컨버팅 작업을 진행하면서 objective-c 코드들도 모두 swift 로 전환하는 작업을 수행했는데, 하던중에 iOS Photos 프레임 워크로 만들어진 Assets picker 라이브러리를 찾았는데 너무 없었다. 그나마 있는 것들은 원하는 기능이 구현되지 않다던지, 사용성이 별로 안좋다던지 그런 문제들이 발생해서, 찾는건 포기하고 직접 만들어 써야겠다고 생각했는데, 이왕 하는김에 오픈소스 프로젝트로 만들어 보자! 라고 해서 시작하게 됐다.
페이스북의 photo picker의 깔끔한 느낌이 좋아서 동일하게 만들어 보고 싶었다.
UI/UX를 참고한것 중에 커스텀이 과하게 되지 않은 가장 기본적인 형태이기 때문이기도 했다.
UI부분을 페이스북을 카피 하면 되었기 때문에 UI고민을 할필요가 없었지만, 하다보니 완전히 똑같이 만드는건 신경써야 할 부분은 좀 있었다.
예를 들어, 앨범을 고르는 popup의 경우 facebook pop library 를 사용했다면 쉽게 구현했겠지만, 오픈소스 dependancy 를 넣고 싶지 않아서 에니메이션을 최대한 비슷하게 하려고 노력했었다. 시간도 꽤 걸렸고.
( 관련코드는 이부분 ) 또, LivePhoto 의 에니메이션을 시작, 종료 하는 시나리오도 페이스북과 똑같이 하고 싶어서 이것저것 많이 고민했던것 같다.
- 몇가지의 난관
PHAssets 를 다루는 예제가 별로 없어서 정답을 스스로 고민해야 하는부분이 조금 힘들었는데, 오픈소스로 만들다 보니 잘못된 소스를 만들까봐 걱정이 된 것들때문에 "정확하게 파악해야 한다"라는 생각이 들어 압박이 있었다.
또 livephoto 는 본인이 iphone 6+ 라서 기기가 없어서 테스트를 별로 못했었다 ㅠ_ㅠ 그래서 크나큰 버그가 있는것도 며칠전에 새로산 아이패드로 테스트 하다가 발견해서 고쳤다. ( 아이패드 사길 잘했... ) iCloud 역시 마찬가지로...
페북의 photo picker 보다 성능이 좋은 부분이 2군데 있다.
1. video asset 으로만 이루어진 경우 페북은 스크롤이 버벅거린다.
- 아마도 재생을 위한 PlayerView를 생성해두기 때문으로 예상된다.
요부분은 TLPhotopicker 에서는 재생이 필요할때에 준비하는 형태로 되어있어서 스크롤 속도에 영향을 주지 않는다.
2. 어느정도 지난 이후에 팀원의 제보로 알게된 문제인데, 앨범에 사진이 엄청나게 많은 경우, ( 14000 장 정도였다 ) 앨범을 불러오는 속도가 어마어마 하게 저하된다.
이 문제를 발견했을 당시 페이스북도 느렸었는데, 인스타그램등 몇몇 앱들은 빨랐다.
해결할수있는 문제라고 판단하고, 확인해보니 에셋의 카운트를 계산할때 실제로 asset을 fetch 하도록 했었는데 이 부분에서 속도 저하가 발생한것. 앨범에서 asset 개수를 알수 있기 때문에 이 때에는 asset을 가져올 필요가 없었다. (이후 async asset request 를 하면 되는 식.)
일단 시작은 페북을 따라 만들었지만 성능 적인 부분에서 몇몇 부분은 페북보다 나았던 점이,
좀 더 좋은 라이브러리를 만들기 위해 노력한 결과가 보인것 같아서 뿌듯했다.
현재 기준 github repo의 상태이다.
star가 하나하나 쌓이고, 이슈를 처리해나가고, pull request를 처리해 나가는 즐거움이 있다.
특히 이슈를 처리하고 나면 몇몇 사람들은 정말 고맙다고 감사의 말을 하곤 하는데, 이 말 한마디가 작업한 시간을 충분히 보상하고도 남았던 것 같다. :)
무엇보다 내가 만든 코드가 누군가에게 도움이 된다는 게 정말 기분좋은 일인 것 같다.
이제 이슈 하나남은거 처리하러 가야겠다~!