-
텍본리더 개발 이슈 - 로딩바의 출력에 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초에 한번만 관찰하도록 제한하고, 값이 변하지 않으면 유아이 변화를 진행하지 않습니다.
값이 변한다면 메인스레드에서 퍼센트를 업데이트합니다.
반응형'iOS' 카테고리의 다른 글
텍스트 리더가 앱스토어에 출시되었습니다. (0) 2018.10.03 UITableView를 스냅킷으로 구현하면서 생겼던 이슈 (0) 2018.09.30 iOS 텍스트 뷰어 개발을 끝내고 검수를 넣으며 (0) 2018.09.30 iOS 12 동작 변경사항 (0) 2018.09.20 iOS 텍스트가 비었으면 확인 버튼 비활성하는 UIAlertController 생성 (1) 2018.09.02