【问题标题】:kReachabilityChangedNotification is called multiple timeskReachabilityChangedNotification 被多次调用
【发布时间】:2014-01-04 09:33:22
【问题描述】:

我正在使用Reachability 类来检查我何时获得了互联网连接以及何时连接。

这是我的代码:

      IN VIEW DID LOAD:

        internetReachable = [Reachability reachabilityForInternetConnection];
        [internetReachable startNotifier];

        // check if a pathway to a random host exists
        hostReachable = [Reachability reachabilityWithHostname:@"www.google.com"];
        [hostReachable startNotifier];


    Then the notification method
    -(void) checkNetworkStatus:(NSNotification *)notice
    {
        // called after network status changes
        NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
        switch (internetStatus)
        {
            case NotReachable:
            {
                NSLog(@"The internet is down. IN AGENDA");
                self.internetActive = NO;

                break;
            }
            case ReachableViaWiFi:
            {
                NSLog(@"The internet is working via WIFI.IN AGENDA");
                self.internetActive = YES;

                break;
            }
            case ReachableViaWWAN:
            {
                NSLog(@"The internet is working via WWAN.IN AGENDA");
                self.internetActive = YES;

                break;
            }
        }

        NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
        switch (hostStatus)
        {
            case NotReachable:
            {
                NSLog(@"A gateway to the host server is down.IN AGENDA");
                self.hostActive = NO;

                break;
            }
            case ReachableViaWiFi:
            {
                NSLog(@"A gateway to the host server is working via WIFI.IN AGENDA");
                self.hostActive = YES;

                break;
            }
            case ReachableViaWWAN:
            {
                NSLog(@"A gateway to the host server is working via WWAN.IN AGENDA");
                self.hostActive = YES;

                break;
            }
        }
    }

And finally how I add en remove the observer
-(void)viewWillAppear:(BOOL)animated{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
}
-(void)viewDidDisappear:(BOOL)animated{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}

问题

似乎视图控制器多次收到通知。 这是我的 NSLOG

2014-01-04 10:32:16.299 Adsolut[10009:333b] CALLED reachabilityChanged
2014-01-04 10:32:16.299 Adsolut[10009:470b] CALLED reachabilityChanged
2014-01-04 10:32:16.300 Adsolut[10009:70b] The internet is down. IN AGENDA
2014-01-04 10:32:16.301 Adsolut[10009:70b] A gateway to the host server is down.IN AGENDA
2014-01-04 10:32:16.301 Adsolut[10009:70b] The internet is down. IN AGENDA
2014-01-04 10:32:16.302 Adsolut[10009:70b] A gateway to the host server is down.IN AGENDA
2014-01-04 10:32:16.313 Adsolut[10009:470b] CALLED reachabilityChanged
2014-01-04 10:32:16.313 Adsolut[10009:4a03] CALLED reachabilityChanged
2014-01-04 10:32:16.314 Adsolut[10009:70b] The internet is working via WIFI.IN AGENDA
2014-01-04 10:32:16.314 Adsolut[10009:333b] CALLED reachabilityChanged
2014-01-04 10:32:16.315 Adsolut[10009:70b] A gateway to the host server is down.IN AGENDA
2014-01-04 10:32:16.314 Adsolut[10009:f63] CALLED reachabilityChanged
2014-01-04 10:32:16.315 Adsolut[10009:70b] The internet is working via WIFI.IN AGENDA
2014-01-04 10:32:16.316 Adsolut[10009:70b] A gateway to the host server is down.IN AGENDA
2014-01-04 10:32:16.316 Adsolut[10009:70b] The internet is working via WIFI.IN AGENDA
2014-01-04 10:32:16.317 Adsolut[10009:70b] A gateway to the host server is down.IN AGENDA
2014-01-04 10:32:16.317 Adsolut[10009:70b] The internet is working via WIFI.IN AGENDA
2014-01-04 10:32:16.318 Adsolut[10009:70b] A gateway to the host server is down.IN AGENDA

有人可以帮忙吗?

【问题讨论】:

    标签: ios iphone objective-c nsnotificationcenter reachability


    【解决方案1】:

    只在appdelegate didFinishLaunchingWithOptions 中添加可达性通知,并在appDelegate 中的Bool 变量isInternetAvailable 中设置可达性的值

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(checkNetworkStatus:)
                                                     name:kReachabilityChangedNotification object:nil];
    
    }
    
    
    - (void)checkNetworkStatus:(NSNotification *)notice {
        // called after network status changes
    
        NetworkStatus internetStatus = [self.internetReachable currentReachabilityStatus];
        switch (internetStatus)
        {
            case NotReachable:
            {
                //#######NSLog(@"The internet is down.");
                self.isInternetAvailable = FALSE;
                break;
            }
            case ReachableViaWiFi:
            {
                //#######NSLog(@"The internet is working via WIFI");
                self.isInternetAvailable = TRUE;
                break;
            }
            case ReachableViaWWAN:
            {
                //#######NSLog(@"The internet is working via WWAN!");
                self.isInternetAvailable = TRUE;
                break;
            }
    
            default:
            {
                //#######NSLog(@"The internet is working via mobile SIM!");
                self.isInternetAvailable = FALSE;
                break;
            }
        }
    }
    

    【讨论】:

    • 移除 [internetReachable startNotifier];从您的 View Controller 中删除您添加的 viewWillAppear 中的通知观察者
    • 为什么?这没有任何帮助。
    • viewDidLoad 中的代码将在您每次登陆该 VC 时执行(在运行应用程序中推送该 VC 之后)。因此,该方法很可能会多次打印NSLog,因为它的执行一次又一次。
    猜你喜欢
    • 2020-06-08
    • 2010-10-24
    • 2011-10-18
    • 2020-10-19
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2023-03-15
    相关资源
    最近更新 更多