Last active
May 9, 2017 08:09
-
-
Save usagimaru/cf883fa8e24e1a529fbfc345a870946e to your computer and use it in GitHub Desktop.
NetworkIndicatorManager.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// NetworkIndicatorManager.swift | |
// | |
// Created by Satori Maru on 15.11.27. | |
// Copyright (c) 2015 Satori Maru. All rights reserved. | |
// | |
import UIKit | |
private let kGeneralLifeKey: Int = -1 | |
fileprivate class NetworkIndicatorLife { | |
var lifeCount: Int = 0 { | |
didSet { | |
lifeCount = max(lifeCount, 0) | |
} | |
} | |
} | |
class NetworkIndicatorManager { | |
private var lifeTable = [String : NetworkIndicatorLife]() | |
fileprivate static let shared: NetworkIndicatorManager = { | |
return NetworkIndicatorManager() | |
}() | |
fileprivate var lifeCount: Int { | |
return lifeTable.values.reduce(0) { | |
return $0 + $1.lifeCount | |
} | |
} | |
static var life: Int { | |
return shared.lifeCount | |
} | |
class func updateIndicatorVisibility() { | |
DispatchQueue.main.async { | |
if life > 0 && UIApplication.shared.isNetworkActivityIndicatorVisible == false { | |
UIApplication.shared.isNetworkActivityIndicatorVisible = true | |
} | |
else if life == 0 && UIApplication.shared.isNetworkActivityIndicatorVisible == true { | |
UIApplication.shared.isNetworkActivityIndicatorVisible = false | |
} | |
} | |
} | |
class func up(in any: NSObject? = nil) { | |
up(with: "\(any?.hash ?? kGeneralLifeKey)") | |
} | |
class func up(with key: String) { | |
DispatchQueue.main.async { | |
let life = shared.lifeTable[key] ?? NetworkIndicatorLife() | |
life.lifeCount += 1 | |
shared.lifeTable[key] = life | |
} | |
updateIndicatorVisibility() | |
} | |
class func down(in any: NSObject? = nil) { | |
down(with: "\(any?.hash ?? kGeneralLifeKey)") | |
} | |
class func down(with key: String) { | |
DispatchQueue.main.async { | |
if let life = shared.lifeTable[key] { | |
life.lifeCount -= 1 | |
if life.lifeCount == 0 { | |
shared.lifeTable[key] = nil | |
} | |
else { | |
shared.lifeTable[key] = life | |
} | |
} | |
} | |
updateIndicatorVisibility() | |
} | |
class func reset(in any: NSObject? = nil) { | |
reset(with: "\(any?.hash ?? kGeneralLifeKey)") | |
} | |
class func reset(with key: String) { | |
DispatchQueue.main.async { | |
if let life = shared.lifeTable[key] { | |
life.lifeCount = 0 | |
shared.lifeTable[key] = nil | |
} | |
} | |
updateIndicatorVisibility() | |
} | |
class func kill() { | |
DispatchQueue.main.async { | |
shared.lifeTable.removeAll() | |
} | |
updateIndicatorVisibility() | |
} | |
} | |
extension NSObject { | |
func networkIndicatorCountUp() { | |
NetworkIndicatorManager.up(in: self) | |
} | |
func networkIndicatorCountDown() { | |
NetworkIndicatorManager.down(in: self) | |
} | |
func resetNetworkIndicatorCount() { | |
NetworkIndicatorManager.reset(in: self) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment