Skip to content

Instantly share code, notes, and snippets.

@mac-cain13
Last active December 7, 2015 11:59
Show Gist options
  • Save mac-cain13/ab1b9196c99dcc16e5fe to your computer and use it in GitHub Desktop.
Save mac-cain13/ab1b9196c99dcc16e5fe to your computer and use it in GitHub Desktop.

Revisions

  1. mac-cain13 revised this gist Oct 30, 2014. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions NetworkActivityIndicatorManager.swift
    Original file line number Diff line number Diff line change
    @@ -2,6 +2,7 @@
    // NetworkActivityIndicatorManager.swift
    //
    // Created by Mathijs Kadijk on 30-10-14.
    // From: https://gist.github.com/ab1b9196c99dcc16e5fe
    // License: Public domain
    //

  2. mac-cain13 created this gist Oct 30, 2014.
    58 changes: 58 additions & 0 deletions NetworkActivityIndicatorManager.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    //
    // NetworkActivityIndicatorManager.swift
    //
    // Created by Mathijs Kadijk on 30-10-14.
    // License: Public domain
    //

    @objc
    class NetworkActivityIndicatorManager {
    private var activityCount: Int
    private var activityIndicatorVisibilityTimer: NSTimer?

    var isNetworkActivityIndicatorVisible: Bool {
    return activityCount > 0
    }

    init() {
    activityCount = 0
    }

    func increment() {
    objc_sync_enter(self)
    activityCount++
    objc_sync_exit(self)

    dispatch_async(dispatch_get_main_queue()) {
    self.updateNetworkActivityIndicatorVisibilityDelayed()
    }
    }

    func decrement() {
    objc_sync_enter(self)
    activityCount = max(activityCount - 1, 0)
    objc_sync_exit(self)

    dispatch_async(dispatch_get_main_queue()) {
    self.updateNetworkActivityIndicatorVisibilityDelayed()
    }
    }

    private func updateNetworkActivityIndicatorVisibilityDelayed() {
    // Delay hiding of activity indicator for a short interval, to avoid flickering
    if (isNetworkActivityIndicatorVisible) {
    dispatch_async(dispatch_get_main_queue()) {
    self.updateNetworkActivityIndicatorVisibility()
    }
    } else {
    activityIndicatorVisibilityTimer?.invalidate()
    activityIndicatorVisibilityTimer = NSTimer(timeInterval: 0.2, target: self, selector: "updateNetworkActivityIndicatorVisibility", userInfo: nil, repeats: false)
    activityIndicatorVisibilityTimer!.tolerance = 0.2
    NSRunLoop.mainRunLoop().addTimer(activityIndicatorVisibilityTimer!, forMode: NSRunLoopCommonModes)
    }
    }

    func updateNetworkActivityIndicatorVisibility() {
    UIApplication.sharedApplication().networkActivityIndicatorVisible = isNetworkActivityIndicatorVisible
    }
    }