実行環境
Swift | 5.6 |
Xcode | 13.3 |
きっかけ
URLSessionやAlamofireを使った通信では、
自動的に非同期処理になってしまうため、いつ通信が完了したのか判断が難しいです。
僕の場合、
「通信開始」→「通信終了」→「次の処理」
という流れを実現したいのに対して、現実は、
「通信開始」→「次の処理」→「次の処理」
という流れになってしまいます。
解決する方法を発見した喜びのあまり、記事を書いています。
現時点で記事を書いている僕は、全くの初心者です。
文書の間違い等は、本記事一番下のコメント欄からご教授頂けると大変嬉しいです!
解決策
「WKNavigationDelegate」のプロトコルを利用します。
>>「WKNavigationDelegate」のApple公式リファレンス
(補足:「WKUIDelegate」プロトコルも通信において結構便利なメッソド多いです。)
このプロトコルで用意されている、下記のメソッドを利用します。
下記のメソッドは、ナビゲーションが完了したことを通知するメソッドで、ここに処理を記述することで検知できるっぽい。
func webView(WKWebView, didFinish: WKNavigation!)
使ってみる
下の動画のように、
通信終了開始時と、通信終了時にprint文を出現するコードを作ってみました。
全コードは下記です。
事前にStoryBoard上でWebViewと接続しておく必要があるのでお忘れなく。
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
@IBOutlet private var webView: WKWebView!
private let urlString = "https://apple.com"
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let url = URL(string: urlString) {
self.webView.load(URLRequest(url: url))
} else {
print("URLが取得できませんでした。")
}
}
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
print("読み込み開始")
}
// MARK: - 読み込み完了
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("読み込み完了")
}
}
ということで、本記事は非同期通信の完了を検知する方法を自分のメモ程度にまとめました。
本記事を書いている僕自身は、まだSwift初学者のためコードに至らない点が多いと思います。参考程度にご活用下さい。
アドバイスやコードの改善などあれば本記事の最後の部分からコメントしてくださいね。
最後まで読んでいただきありがとうございました!
おすすめSwift書籍
Swiftを学ぶなら、間違いのない2冊はこちら
Xcodeを学ぶなら下の一冊