Skip to content

Instantly share code, notes, and snippets.

@usagimaru
Last active May 9, 2017 08:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save usagimaru/cf883fa8e24e1a529fbfc345a870946e to your computer and use it in GitHub Desktop.
Save usagimaru/cf883fa8e24e1a529fbfc345a870946e to your computer and use it in GitHub Desktop.
NetworkIndicatorManager.swift
//
// 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