Swift

SVProgressHUDで遅延処理してdismissする

More than 3 years have passed since last update.

ローディング中に通信環境が悪い時に止まっているように見えるのを防ぐために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()

Swiftで遅延処理