ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 텍본리더 개발 이슈 - 로딩바의 출력에 rxSwift를 도입
    iOS 2018. 9. 30. 22:28

    텍스트 뷰어를 로딩할 때, NSAttributedString을 적절히 페이지 크기만큼 분할해 [NSRange] 형태로 내뱉는 연산을 하는 과정이 있었습니다.



    이런 식으로 텍스트를 분할하는 것인데.. 이 과정에 시간이 많이 소모되어 로딩바를 보여줄 필요가 있었습니다.

    지금 개발상황에서는 2MB 기준으로 완전히 로딩하는 데 시간이 1분정도 걸립니다...


    따라서 퍼센트로 표현해주는 로딩바가 필요했습니다.



    대충 이런 느낌의 로딩바이죠.



    처음에는 페이지 한장 한장씩 렌더링할 때마다 로딩프로세스를 업데이트하는 방식을 사용했습니다만,

    이 경우 너무 많이 유아이를 업데이트하는 문제가 있었습니다.


    로딩바 자체가 기다리는 작업이 만흥ㄹ 때 필요한 것인데..

    로딩바의 업데이트가 자원을 많이 소모하는 것은 말이 안되는 문제였죠.


    그것도 있고, 로딩바를 업데이트하는 건 메인 스레드에서 일어나고,

    페이지 렌더링하는 건 백그라운드에서 일어나니,

    전달된 퍼센트가 순서대로 업데이트를 하지 않는 문제가 있었습니다.


    5퍼센트로 입력되고, 10퍼로 가야 하는데

    그 반대로 한다든가 하는 문제였죠.


    이런저런 고민을 한 결과, rxSwift 라이브러리를 사용해 보기로 마음먹었습니다.


    값의 변화를 관찰하고, 너무 값이 빨리 변하면 바로 유아이를 업데이트하지 않게 하는 기능이 

    이런 로딩바 구현에 알맞다고 생각했기 때문입니다.



        var percentage : Variable<CGFloat?> = Variable(0) 

    let disposeBag = DisposeBag()

        func percentageCheck(){

    //        let percentageCheck =

            percentage

                .asObservable()

                .throttle(0.3, scheduler: MainScheduler.instance)

                .distinctUntilChanged()

                .observeOn(MainScheduler.instance)


                .subscribe(onNext: { [weak self] (percentage) in

                    guard let percentage = percentage else {

                        return

                    }

                    self?.percentageLabel.text = "\(Int(percentage * 100))%"

                    self?.shapeLayer.strokeEnd = percentage

                })

                .disposed(by: disposeBag)

            

        }



    퍼센테이지 옵저버를 관찰하는데, 0.3초에 한번만 관찰하도록 제한하고, 값이 변하지 않으면 유아이 변화를 진행하지 않습니다.

    값이 변한다면 메인스레드에서 퍼센트를 업데이트합니다.


Designed by Tistory.