kReachabilityChangedNotification is called multiple times
Asked Answered
L

1

9

I'm using the Reachability classes for checking when I got an internet connection en when it goes down.

This is my code:

      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];
}

THE PROBLEM

It seems like that the viewcontroller gets the notification multiple times. This is my 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

Can somebody help ?

Lustre answered 4/1, 2014 at 9:33 Comment(0)
K
4

Add the reachability notification in the appdelegate didFinishLaunchingWithOptions only and set the value of reachability in Bool variable isInternetAvailable in appDelegate

- (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;
        }
    }
}
Knutson answered 4/1, 2014 at 10:21 Comment(3)
remove [internetReachable startNotifier]; from your View Controller and also remove notification observer in viewWillAppear that you have addedKnutson
Why? This doesn't do any help.Platto
The code in your viewDidLoad will execute every time when you will land on that VC (after pushing that VC in running application). Hence chances are that method is printing the NSLog multiple times, as its executing time and again.Dilation

© 2022 - 2024 — McMap. All rights reserved.