Reachability reachable и unreachableBlock се извикват многократно?

Използвам Reachability, за да проверя състоянието на мрежата за моето приложение, всичко работи добре, освен че в iOS 9.0.1 или по-нова версия reachableBlock и unreachableBlock се извикват два пъти, което ме затруднява.

Това се случва само в iOS 9.0.1 и iOS 9.1 Beta.

И ето пример за моя код:

-(void)checkServerConnection{
//This nslog is to check the method is called only once.
    NSLog(@"Check Server Connection");

    Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];
    [reach startNotifier];
    reach.reachableBlock = ^(Reachability*reach)
    {
//This NSLOG is called twice
        NSLog(@"Reachability reachable block");
        dispatch_async(dispatch_get_main_queue(), ^{
//This NSLOG is called twice
            NSLog(@"REACHABLE!");     
        });
    };

    reach.unreachableBlock = ^(Reachability*reach)
    {
//Same story for this one..
        NSLog(@"UNREACHABLE!");
}
}

Моля, ако някой е решил този проблем да ми каже как.


person Karlo A. López    schedule 29.09.2015    source източник
comment
Причината да се случва: stackoverflow.com/a/35453136/4260691   -  person OhadM    schedule 17.02.2016


Отговори (1)


Точно това имам предвид, това трябва да е коментар, но е твърде дълъг.

Моля, позволете ми да обясня какво се случва във вашия код...
Не съм много сигурен за това, но мисля, че iOS 9.0.1 и iOS 9.1 запазват променливата поради това [reach startNotifier];..

Когато извикате метода -(void)checkServerConnection, вие създавате new Reachability* reach и т.н.

АКО извикате метода отново, той ще създаде new Reachability* reach и има съществуващ такъв..

Възможно решение е да се създаде глобална променлива (Reachability* reach), която ще се използва повторно при всяко извикване на метода.


Вероятно нещо подобно:

Reachability* reachVar;
// i've changed your variable name hope that's okay, just for example.

-(void)checkServerConnection{

    NSLog(@"Check Server Connection");

    if (reachVar == nil)
    {
        reachVar = [Reachability reachabilityWithHostname:@"www.google.com"];
        [reachVar startNotifier];
    }
    reachVar.reachableBlock = ^(Reachability*reach)
    {
        NSLog(@"Reachability reachable block");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"REACHABLE!");     
        });
    };

    reachVar.unreachableBlock = ^(Reachability*reach)
    {
        NSLog(@"UNREACHABLE!");
    }
}
person 0yeoj    schedule 29.09.2015
comment
Благодаря за отговора, за съжаление това не проработи, създадох глобалната променлива, но грешката продължава, методът се извиква само ВЕДНЪЖ при viewDidLoad - person Karlo A. López; 01.10.2015
comment
Същото е в iOS 10.2, мисля, че добавянето на глобална променлива е необходимо. - person AndaluZ; 03.01.2017
comment
Не е решение. Все още манипулаторът се обажда два пъти. - person Sandeep Ahuja; 21.08.2017