ローディング中に通信環境が悪い時に止まっているように見えるのを防ぐためにSVProgressHUDを使ってロード中アニメーションを使った。
loadingStateはenum型の列挙型。
public enum LoadingState {
case None
case InProgress
case Success
case Failure
}
viewModel.loadingState.observeNew { state in
switch state {
case .InProgress :
SVProgressHUD.initializeAndShow()
default :
SVProgressHUD.dismiss()
self.refreshControl.endRefreshing()
}
}
ただ、通信処理が早く終わってしまうとぐるぐるが出てすぐ消える、ということが発生してしまい使っていて不快なので、通信処理が終わったら何秒かdelayさせてからぐるぐるを消すようにしました。
SVProgressHUD.swift
import SVProgressHUD
extension SVProgressHUD {
//省略
class func delayAndDismiss(time: Double){
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.dismiss()
}
}
}
viewModel.loadingState.observeNew { state in
switch state {
case .InProgress :
SVProgressHUD.initializeAndShow()
default :
// 通信処理が終わってから0.5秒delayさせる
SVProgressHUD.delayAndDismiss(0.5)
self.refreshControl.endRefreshing()
}
}
しかしながらこれだと通信処理が長い場合も、処理が終わったらdelayされてしまうので処理時間がxx秒以上だとdelayさせないようにしたい。どなたかいい方法があれば教えてください。
以下参考。
元記事
Swiftでロード中アニメーションSVProgressHUDを利用するには
・ローディングを表示
SVProgressHUD.show()
・ローディングを表示(文字を入力)
SVProgressHUD.showWithStatus("読み込み中")
・成功
SVProgressHUD.showSuccessWithStatus("接続成功!!")
・失敗
SVProgressHUD.showErrorWithStatus("ネットワーク通信エラーです")
・引っ込める
SVProgressHUD.dismiss()