RxSwift를 사용하여 WKWebView의 로딩 프로세스를 잘 느낍니다.
개요
이미지
샘플 리포지토리
환경
환경 구축
Podfile pod 'RxSwift'
pod 'RxCocoa'
pod 'RxOptional'
화면
ViewController
WKWebView를 포함한 ViewController
pod 'RxSwift'
pod 'RxCocoa'
pod 'RxOptional'
ViewController
WKWebView를 포함한 ViewController
구현해 간다
우선, Swift의 observer를 사용한 패턴으로 구현
WKWebViewController.swiftimport UIKit
import WebKit
class WKWebViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
@IBOutlet weak var progressView: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
setupWebView()
}
private func setupWebView() {
webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
let url = URL(string: "https://www.google.com/")
let urlRequest = URLRequest(url: url!)
webView.load(urlRequest)
progressView.setProgress(0.1, animated: true)
}
deinit {
webView?.removeObserver(self, forKeyPath: "loading")
webView?.removeObserver(self, forKeyPath: "estimatedProgress")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "loading" {
UIApplication.shared.isNetworkActivityIndicatorVisible = webView.isLoading
if !webView.isLoading {
progressView.setProgress(0.0, animated: false)
navigationItem.title = webView.title
}
}
if keyPath == "estimatedProgress" {
progressView.setProgress(Float(webView.estimatedProgress), animated: true)
}
}
}
import UIKit
import WebKit
class WKWebViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
@IBOutlet weak var progressView: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
setupWebView()
}
private func setupWebView() {
webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
let url = URL(string: "https://www.google.com/")
let urlRequest = URLRequest(url: url!)
webView.load(urlRequest)
progressView.setProgress(0.1, animated: true)
}
deinit {
webView?.removeObserver(self, forKeyPath: "loading")
webView?.removeObserver(self, forKeyPath: "estimatedProgress")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "loading" {
UIApplication.shared.isNetworkActivityIndicatorVisible = webView.isLoading
if !webView.isLoading {
progressView.setProgress(0.0, animated: false)
navigationItem.title = webView.title
}
}
if keyPath == "estimatedProgress" {
progressView.setProgress(Float(webView.estimatedProgress), animated: true)
}
}
}
google.com
가로드됩니다. ActivityIndicator
표시 및 숨기기 NavigationController
의 title
에 표시된 URL의 제목이 설정됩니다 이 쓰기의 좋은 곳
이 쓰는 법의 나쁜 곳
"loading"
, "estimatedProgress"
와 같이, 키를 베타 써야 한다removeObserver
그럼, 이것에 근거해 RxSwift를 사용한 패턴으로 구현
RxWKWebViewController.swift
import UIKit
import WebKit
import RxSwift
import RxCocoa
import RxOptional
class RxWKWebViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
@IBOutlet weak var progressView: UIProgressView!
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupWebView()
}
private func setupWebView() {
// プログレスバーの表示制御、ゲージ制御、アクティビティインジケータ表示制御で使うため、一旦オブザーバを定義
let loadingObservable = webView.rx.observe(Bool.self, "loading")
.filterNil()
.share()
// プログレスバーの表示・非表示
loadingObservable
.map { return !$0 }
.observeOn(MainScheduler.instance)
.bind(to: progressView.rx.isHidden)
.disposed(by: disposeBag)
// iPhoneの上部の時計のところのバーの(名称不明)アクティビティインジケータ表示制御
loadingObservable
.bind(to: UIApplication.shared.rx.isNetworkActivityIndicatorVisible)
.disposed(by: disposeBag)
// NavigationControllerのタイトル表示
loadingObservable
.map { [weak self] _ in return self?.webView.title }
.observeOn(MainScheduler.instance)
.bind(to: navigationItem.rx.title)
.disposed(by: disposeBag)
// プログレスバーのゲージ制御
webView.rx.observe(Double.self, "estimatedProgress")
.filterNil()
.map { return Float($0) }
.observeOn(MainScheduler.instance)
.bind(to: progressView.rx.progress)
.disposed(by: disposeBag)
let url = URL(string: "https://www.google.com/")
let urlRequest = URLRequest(url: url!)
webView.load(urlRequest)
}
}
좋은 곳
removeObserver
걱정하지 마세요 나쁜 곳
요약
removeObserver
걱정하지 않아도 좋아졌다 소감
removeObserver
를 잊을 때가 절대 온다다음에 하고 싶은
RxWebKit
라는 라이브러리가 있고 더 간결하게 걸릴 것 같았기 때문에 RxWebKit를 사용한 구현 샘플 기사를 쓴다 Reference
이 문제에 관하여(RxSwift를 사용하여 WKWebView의 로딩 프로세스를 잘 느낍니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/k0uhashi/items/1b2913422aea0af28d56텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)