2017-01-01 108 views
0

我有一个tabBarController与2个选项卡和Reachability类的互联网连接。Swift2 iOS的可达性类和NSNotificatonCenter没有收到广播

里面的AppDelegatedidFinishLaunching方法我有一个checkReachability功能,它检查当前网络连接,以查看是否wifi的是开启还是关闭,它会广播NSNotification到在任一情况下第二个标签。

第二个标签内有标签,viewDidLoad里面有2个观察者正在收听广播。我还有两个功能(由观察者触发),它们将根据当前网络连接更改标签文本。

我正在使用模拟器,当我从第一个或第二个选项卡开启/关闭wifi时,第二个选项卡的标签文本永远不会更改。

为什么文本没有改变,为什么观察者没有回应?

可达性类别: FYI我从这个YouTube VID得到了可达性类和我切换它从夫特3到SWIFT 2.3:https://www.youtube.com/watch?v=IlsfXjESatg&t=532s

import Foundation 
import UIKit 
import SystemConfiguration 

protocol Utilities { 
} 

extension NSObject:Utilities{ 

    enum ReachabilityStatus { 
     case notReachable 
     case reachableViaWWAN 
     case reachableViaWiFi 
    } 

    var currentReachabilityStatus: ReachabilityStatus { 

     var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 

     zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) 
     zeroAddress.sin_family = sa_family_t(AF_INET) 

     guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, { 
      SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) 
     }) else { 
      return .notReachable 
     } 

     var flags: SCNetworkReachabilityFlags = [] 
     if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { 
      return .notReachable 
     } 

     if flags.contains(SCNetworkReachabilityFlags.Reachable) == false{ 
      // The target host is not reachable. 
      return .notReachable 
     } 
     else if flags.contains(SCNetworkReachabilityFlags.IsWWAN) == true{ 
      // WWAN connections are OK if the calling application is using the CFNetwork APIs. 
      return .reachableViaWWAN 
     } 

     else if flags.contains(.ConnectionRequired) == false { 
      // If the target host is reachable and no connection is required then we'll assume that you're on Wi-Fi... 
      return .reachableViaWiFi 
     } 
     else if (flags.contains(.ConnectionOnDemand) == true || flags.contains(.ConnectionOnTraffic) == true) && flags.contains(.InterventionRequired) == false { 
      // The connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs and no [user] intervention is needed 
      return .reachableViaWiFi 
     } 
     else { 
      return .notReachable 
     } 
    } 
} 

的AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    self.checkReachability() 

    return true 
} 
//This function is declared inside AppDelegate 
func checkReachability(){ 
    if currentReachabilityStatus == .reachableViaWiFi { 
      NSNotificationCenter.defaultCenter().postNotificationName("wifi", object: nil) 
    }else if currentReachabilityStatus == .reachableViaWWAN{ 
      print("WWAN.") 
    }else{ 
      NSNotificationCenter.defaultCenter().postNotificationName("noWifi", object: nil) 
    } 
} 

第二个选项卡:

class SecondTabController: UIViewController { 

@IBOutlet weak var labelTwo: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(wifiConnection), name: "wifi", object: nil) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(noConnection), name: "noWifi", object: nil) 
} 

func wifiConnection(){ 
    self.labelTwo.text = "Wifi Connection" 
} 

func noConnection(){ 
    self.labelTwo.text = "No Connection" 
} 

deinit{ 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "wifi", object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "noWifi", object: nil) 
} 
} 

回答

1

您要发布通知只有一次,通知中心,应用程序启动时,即:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Your method `checkReachability` will post notifications: 
    self.checkReachability() 
    return true 
} 

但是尚未创建您的SecondTabController,因此它尚未认购接收你的应用程序开始发送通知。当通知发布后,任何订户立即收到。通知“不要等待”,直到稍后的某个用户被添加为止。

您可能需要作为可达性管理器,在WiFi可达性发生变化时继续存在并将通知发布到通知中心。

您可能想要使用现有的可达性管理器such as Alamofire's NetworkReachabilityManager as described in this question

+0

Bumberg感谢您的建议和HNY!看这个视频。他没有使用tabBar,而是在didFinish(min 12:09)中设置了checkStatus函数,并且在另一个vc的viewDidLoad中有一个订阅者(尽管单个vc应用程序不是标签)。当他打开/关闭无线网络时,它工作正常(分29:35)。如果我的第二个选项卡还没有创建,一旦我点击它,它是活着的,在那个点上不应该开启/关闭无线网络,而仍然在该选项卡内工作就像他一样?我还将相同的用户代码放在tabOne中,因为它只有一个标签。它在启动时立即加载,也不会在那里发生。 https://youtu.be/BlBhHgoW9wM - –