mono0926
4/4/2017 - 4:28 AM

`UIApplication.shared.isNetworkActivityIndicatorVisible` 管理クラス(delay非対応)

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)
        }
    }
}