iOS/ios 아무거나 만들어보기

CollectionView Prefetch 살펴보기

728x90

 

이전 글에서 CollectionView의 기본적인 사용법을 알아봤다.

이외에 다른 기능들중 재밌는게 뭐 없나 공식문서를 보다가 Prefetching 기능이 있는걸 알게되었다.

 

오.. prefetch를 어떻게하는거지 하고 찾아보다가 공식문서에 예제가 있네...? 

iOS 10에서 추가된 기능으로 WWDC에도 나온 부분인 것 같다.

 

A Tour of UICollectionView - WWDC18 - Videos - Apple Developer

UICollectionView is a flexible, powerful tool to help you achieve great user experiences in your applications. Hear how you can leverage...

developer.apple.com

 

prefetch 샘플예제

 

Apple Developer Documentation

 

developer.apple.com

 

소스를 열어보니까 단순하게 화면에 안보이는 indexPath를 전달받아서 데이터 fetch를 하고 있길래

fetch 부분을 보니 DispatchQueue, operationQueue 에 대한 내용을 모르면 이해하기가 난해하겠구나 싶었다.

 

queue에 넣어두면 백그라운드에서 ios가 적당한 시점에 실행시켜주는 개념을 알고 있어야하고, 실행이 끝났을 시점을 알 수 있게

completionBlock를 지원하는걸 알고 있어야한다.

 

전체적인 소스를 보고 나름 그림을 그려서 생각을 해봤다.

 

PreFetch 요청 

 

prefetch 

1) collectionView의 prefetch를 인식하고(delegate부분 ) prefetch를 요청한다. 

prefetch에서는 view에 보여지지 않고 데이터만 부르는 것이기 때문에 Handler(view에 data를 표현)를 따로 전달하지는 않는다.

 

2) fetchQueue에서 해당하는 prefetch가 존재하는지 확인한다. operationAsync가 이제 OperationQueue를 상속하는 class인데, 이 안에 식별할 수 있는 identifier을 넣어놔서 해당 opeartionQueue가 fetch중인지, 취소되었는지 알 수 있다.

 

3) fetch중이거나 취소되지 않았다면 cache 되었는지 확인해본다. 있다면 캐시된 데이터로 handler(view에 data를 표현)를 동작시켜준다.

 

4) 둘 다 아니라면 datafetch를 요청한다.

 

5) 위에서 말한 operationAsync가 FetchQueue에 들어가서 operationAsync의 main함수를 실행시킨다. 실질적으로 여기선 아니지만, 네트워크에 dataFetch를 실행하는 클래스다. (OperationQueue의 특징 중 하나는 한번만 실행되고, 또 실행할려면 새로 생성해줘야하는 특징이 있다.)

 

6) FetchQueue에서 OperationAsync의 main이 수행되었다면, OperationQueue에서 main함수가 끝난 후(데이터를 불러온 후) 해당 data로 invokeCompletionHandlers로 전달하게 된다. 

 

7) InvokeCompletionHandlers는 handler가 여러번 들어왔을 때 한 개만 실행하게 도와주는 메서드로 사용하고 있다. handler는 ui를 수정하기 때문에 mainQueue에서 실행되게 되어있다. 그리고 이 handler는 prefetch에선 전달받지 않고, 실제로 cell을 보여주는

cellForItemAt이 있는 그 collectionView delegate에서 넣어서 요청하게된다.


Fetch 요청 

그럼 아래에서 실제로 Cell에서 fetch를 요청하면 어떻게 되는지 봐보자.

cell fetch요청

1) cell이 보여질 때 prefetch에서 요청한 것 처럼 fetch중인지 cache가 된 데이터가 있는지 확인하고 화면에 보여주게 된다.

2) 만약 두개의 조건 false라면 prefetch 처럼 동작하고, 다른점은 handler가 있기 때문에 화면을 업데이트 하게 된다.

 

생각

실제로 적용할려면 어떻게 해야할까?

실제 데이터는 미리 생성하지 않기 때문에 예제처럼 id를 가지고 있는 Struct를 만들 수 가 없다. 전체 count를 받아오면 모를까... 

indexPath별로 데이터를 prefetch하는데 실제론 100개의 데이터를 100번 네트워크 요청 할 수 는 없다.

scroll 할 때마다 보여지는 갯 수만큼 page를 요청해야 할 것 같기도 하고 ...

 

전체적인 로직은 알았는데, 음.. 실제 네트워크를 통한 구현은 찾아봐야겠다.  구현만 해보면 필요할 때 사용 할 수 있어보인다.

근데 이런거 왜 내가 직접 구현해야하는지.. 캐싱해주는 라이브러리 있지않나? 

 

구현하면서 라이브러리 없는지 찾아봐야겠다.

 

반응형