Browse Source

Merge pull request #6 from Abizern/better_timer

Better timer
Ashley Mills 10 years ago
parent
commit
cc1358c49c
1 changed files with 32 additions and 15 deletions
  1. 32 15
      Reachability.swift

+ 32 - 15
Reachability.swift

@@ -63,7 +63,7 @@ class Reachability: NSObject, Printable {
                 return .ReachableViaWiFi
             }
             if isRunningOnDevice {
-                return .ReachableViaWWAN;
+                return .ReachableViaWWAN
             }
         }
         
@@ -113,18 +113,31 @@ class Reachability: NSObject, Printable {
         reachabilityObject = self
         let reachability = self.reachabilityRef!
         
-        previousReachabilityFlags = reachabilityFlags;
-        timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "timerFired:", userInfo: nil, repeats: true)
-        
-        return true;
+        previousReachabilityFlags = reachabilityFlags
+        if let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, timer_queue) {
+            dispatch_source_set_timer(timer, dispatch_walltime(nil, 0), 500 * NSEC_PER_MSEC, 100 * NSEC_PER_MSEC)
+            dispatch_source_set_event_handler(timer, { [unowned self] in
+                self.timerFired()
+            })
+            
+            dispatch_timer = timer
+            dispatch_resume(timer)
+            
+            return true
+        } else {
+            return false
+        }
     }
     
     func stopNotifier() {
         
-        reachabilityObject = nil;
+        reachabilityObject = nil
+        
+        if let timer = dispatch_timer {
+            dispatch_source_cancel(timer)
+            dispatch_timer = nil
+        }
         
-        timer?.invalidate()
-        timer = nil;
     }
     
     // MARK: - *** Connection test methods ***
@@ -183,21 +196,25 @@ class Reachability: NSObject, Printable {
     
     private var reachabilityRef: SCNetworkReachability?
     private var reachabilityObject: AnyObject?
-    private var timer: NSTimer?
+    private var dispatch_timer: dispatch_source_t?
+    private lazy var timer_queue: dispatch_queue_t = {
+        return dispatch_queue_create("uk.co.joylordsystems.reachability_timer_queue", nil)
+    }()
     private var previousReachabilityFlags: SCNetworkReachabilityFlags?
     
     private init(reachabilityRef: SCNetworkReachability) {
-        reachableOnWWAN = true;
-        self.reachabilityRef = reachabilityRef;
+        reachableOnWWAN = true
+        self.reachabilityRef = reachabilityRef
     }
     
-    func timerFired(timer: NSTimer) {
-        
+    func timerFired() {
         let currentReachabilityFlags = reachabilityFlags
         if let _previousReachabilityFlags = previousReachabilityFlags {
             if currentReachabilityFlags != previousReachabilityFlags {
-                reachabilityChanged(currentReachabilityFlags)
-                previousReachabilityFlags = currentReachabilityFlags
+                dispatch_async(dispatch_get_main_queue(), { [unowned self] in
+                    self.reachabilityChanged(currentReachabilityFlags)
+                    self.previousReachabilityFlags = currentReachabilityFlags
+                })
             }
         }
     }