Kaynağa Gözat

Improve intialisation

required init no longer failable
reachabilityForInternetConnection() and reachabilityForLocalWiFi() now throw errors
startNotifier() now throws
Ashley Mills 10 yıl önce
ebeveyn
işleme
d9e781f1b7

+ 10 - 5
Reachability Sample/Reachability Sample/Base.lproj/Main.storyboard

@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="15A282b" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
+        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
     </dependencies>
     <scenes>
         <!--View Controller-->
@@ -16,17 +18,20 @@
                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UBQ-2c-x8L">
-                                <rect key="frame" x="247.5" y="274" width="105" height="52.5"/>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UBQ-2c-x8L">
+                                <rect key="frame" x="40" y="274" width="520" height="53"/>
+                                <animations/>
                                 <fontDescription key="fontDescription" type="system" pointSize="44"/>
                                 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                                 <nil key="highlightedColor"/>
                             </label>
                         </subviews>
+                        <animations/>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                         <constraints>
                             <constraint firstAttribute="centerY" secondItem="UBQ-2c-x8L" secondAttribute="centerY" id="K7q-cv-Lfi"/>
-                            <constraint firstAttribute="centerX" secondItem="UBQ-2c-x8L" secondAttribute="centerX" id="uI2-nJ-Jmf"/>
+                            <constraint firstItem="UBQ-2c-x8L" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" constant="20" id="YBI-sa-7Z9"/>
+                            <constraint firstAttribute="trailingMargin" secondItem="UBQ-2c-x8L" secondAttribute="trailing" constant="20" id="xcC-HE-ZUz"/>
                         </constraints>
                     </view>
                     <connections>

+ 1 - 1
Reachability Sample/Reachability Sample/Info.plist

@@ -15,7 +15,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.0-beta5</string>
+	<string>2.1-beta1</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>

+ 17 - 2
Reachability Sample/Reachability Sample/ViewController.swift

@@ -14,11 +14,20 @@ class ViewController: UIViewController {
 
     @IBOutlet weak var networkStatus: UILabel!
     
-    let reachability = Reachability.reachabilityForInternetConnection()
+    var reachability: Reachability?
     
     override func viewDidLoad() {
         super.viewDidLoad()
 
+        do {
+            guard let reachability = try Reachability.reachabilityForInternetConnection() else { return }
+            self.reachability = reachability
+        } catch ReachabilityError.FailedToCreateWithAddress(let address) {
+            networkStatus.textColor = UIColor.redColor()
+            networkStatus.text = "Unable to create\nReachability with address:\n\(address)"
+            return
+        } catch {}
+        
         if (useClosures) {
             reachability?.whenReachable = { reachability in
                 self.updateLabelColourWhenReachable(reachability)
@@ -30,7 +39,13 @@ class ViewController: UIViewController {
             NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: ReachabilityChangedNotification, object: reachability)
         }
         
-        reachability?.startNotifier()
+        do {
+            try reachability?.startNotifier()
+        } catch {
+            networkStatus.textColor = UIColor.redColor()
+            networkStatus.text = "Unable to start\nnotifier"
+            return
+        }
         
         // Initial reachability check
         if let reachability = reachability {

+ 29 - 20
Reachability.swift

@@ -28,6 +28,12 @@ POSSIBILITY OF SUCH DAMAGE.
 import SystemConfiguration
 import Foundation
 
+enum ReachabilityError: ErrorType {
+    case FailedToCreateWithAddress(sockaddr_in)
+    case UnableToSetCallback
+    case UnableToSetDispatchQueue
+}
+
 public let ReachabilityChangedNotification = "ReachabilityChangedNotification"
 
 func callback(reachability:SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutablePointer<Void>) {
@@ -86,7 +92,7 @@ public class Reachability: NSObject {
 
     // MARK: - *** Initialisation methods ***
     
-    required public init?(reachabilityRef: SCNetworkReachability?) {
+    required public init(reachabilityRef: SCNetworkReachability) {
         reachableOnWWAN = true
         self.reachabilityRef = reachabilityRef
     }
@@ -94,24 +100,25 @@ public class Reachability: NSObject {
     public convenience init?(hostname: String) {
         
         let nodename = (hostname as NSString).UTF8String
-        let ref = SCNetworkReachabilityCreateWithName(nil, nodename)
+        guard let ref = SCNetworkReachabilityCreateWithName(nil, nodename) else { return nil }
+
         self.init(reachabilityRef: ref)
     }
 
-    public class func reachabilityForInternetConnection() -> Reachability? {
-
+    public class func reachabilityForInternetConnection() throws -> Reachability? {
+        
         var zeroAddress = sockaddr_in()
         zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
         zeroAddress.sin_family = sa_family_t(AF_INET)
         
-        let ref = withUnsafePointer(&zeroAddress) {
+        guard let ref = withUnsafePointer(&zeroAddress, {
             SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
-        }
+        }) else { throw ReachabilityError.FailedToCreateWithAddress(zeroAddress) }
         
         return Reachability(reachabilityRef: ref)
     }
 
-    public class func reachabilityForLocalWiFi() -> Reachability? {
+    public class func reachabilityForLocalWiFi() throws -> Reachability? {
 
         var localWifiAddress: sockaddr_in = sockaddr_in(sin_len: __uint8_t(0), sin_family: sa_family_t(0), sin_port: in_port_t(0), sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
         localWifiAddress.sin_len = UInt8(sizeofValue(localWifiAddress))
@@ -121,30 +128,32 @@ public class Reachability: NSObject {
         let address: UInt32 = 0xA9FE0000
         localWifiAddress.sin_addr.s_addr = in_addr_t(address.bigEndian)
 
-        let ref = withUnsafePointer(&localWifiAddress) {
+        guard let ref = withUnsafePointer(&localWifiAddress, {
             SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
-        }
+        }) else { throw ReachabilityError.FailedToCreateWithAddress(localWifiAddress) }
+        
         return Reachability(reachabilityRef: ref)
     }
 
     // MARK: - *** Notifier methods ***
-    public func startNotifier() -> Bool {
+    public func startNotifier() throws {
 
-        if notifierRunning { return true }
+        if notifierRunning { return }
         
         var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
         context.info = UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque())
         
-        if SCNetworkReachabilitySetCallback(reachabilityRef!, callback, &context) {
-            if SCNetworkReachabilitySetDispatchQueue(reachabilityRef!, reachabilitySerialQueue) {
-                notifierRunning = true
-                return true
-            }
+        if !SCNetworkReachabilitySetCallback(reachabilityRef!, callback, &context) {
+            stopNotifier()
+            throw ReachabilityError.UnableToSetCallback
         }
-        
-        stopNotifier()
-        
-        return false
+
+        if !SCNetworkReachabilitySetDispatchQueue(reachabilityRef!, reachabilitySerialQueue) {
+            stopNotifier()
+            throw ReachabilityError.UnableToSetDispatchQueue
+        }
+
+        notifierRunning = true
     }