UIApplication.shared.isNetworkActivityIndicatorVisible
管理クラス(delay非対応)
import Foundation
public class NetworkIndicatorManager {
private init() {}
private var lastStart: Date?
private var count = 0
private let lockQueue = DispatchQueue(label: "network indicator manager lock serial queue")
public var timeout: TimeInterval? = 5
public static let shared = NetworkIndicatorManager()
private func toggleNetworkIndicator(isVisible: Bool) {
UIApplication.shared.isNetworkActivityIndicatorVisible = isVisible
}
public func start() {
lockQueue.sync {
count += 1
toggleNetworkIndicator(isVisible: true)
lastStart = Date()
}
if let timeout = timeout {
dispatchOnMainThread(delay: timeout) {
self.endIfTimeout()
}
}
}
public func end() {
lockQueue.sync {
count = max(0, count - 1)
toggleNetworkIndicator(isVisible: count > 0)
}
}
private func endIfTimeout() {
guard
let lastStart = lastStart,
let timeout = timeout,
UIApplication.shared.isNetworkActivityIndicatorVisible,
Date() > lastStart.addingTimeInterval(timeout) else {
return
}
lockQueue.sync {
count = 0
toggleNetworkIndicator(isVisible: false)
}
}
}