2013-04-01 6 views
0

Я тестирую подключение к Интернету с Reachability и dispatch_async(dispatch_get_main_queue() , когда я тестирую следующий код, он работает, но он вызывается несколько раз.IOS dispatch_get_main_queue() вызывается несколько раз

Родитель:

@protocol RootViewDelegate <NSObject> 
@optional 
-(void)internetIsDownGoToRoot; 
@end 
- (void)testInternetConnection 
{ 
    internetReachableFoo = [ReachabilityTony reachabilityWithHostname:@"www.google.com"]; 

    __weak typeof(self) weakSelf = self; 
    // Internet is reachable 
    internetReachableFoo.reachableBlock = ^(ReachabilityTony *reach) 
    { 
     // Update the UI on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"Yayyy, we have the interwebs!"); 
      [weakSelf sendLoginRequest]; 
     }); 
    }; 
     // Internet is not reachable 
internetReachableFoo.unreachableBlock = ^(ReachabilityTony *reach) 
{ 
    // Update the UI on the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"Someone broke the internet :("); 
     CloudConnection *sharedInstance=[CloudConnection sharedInstance]; 
     sharedInstance.isUserLoggedIN=NO; 
     //update login button 
     [weakSelf updateButtons]; 
     [weakSelf notifyChild]; 

    }); 
}; 
    [internetReachableFoo startNotifier]; 
} 
-(void)viewDidAppear:(BOOL)animated 
{ 
[self testInternetConnection]; 
} 
-(void)viewWillDisappear:(BOOL)animated 
{ 
    internetReachableFoo= nil; 

} 
//notify childs no connection come back to root 
-(void) notifyChild 
{ 
    [delegate internetIsDownGoToRoot]; 

} 

Ребенок:

-(void)viewDidAppear:(BOOL)animated 
{ 

    NSArray *viewControllers =  self.navigationController.viewControllers; 
    int count = [viewControllers count]; 
    id previousController = [viewControllers objectAtIndex:count - 2]; 
    RootViewController *rvc= previousController; 
    rvc.delegate=self; 


} 

-(void)internetIsDownGoToRoot 
{ 
    //internet connection is no avaliable go to root 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

} 

Так что это parentview позволяет сказать, что я пуш-поп childview 5 раз и выключение Интернет. Я вижу на NSLog, что

Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(

, как вы можете видеть, я добавил internetReachableFoo= nil;, но я ничего не изменяет.

Что происходит с кодом выше, почему он называется несколько раз?

Каковы возможные опасности использования этого блока?

ответ

4

Это называется несколько раз, потому что каждый раз, когда вы выталкиваете ребенка, корень получает -viewDidAppear: и вызывает -testInternetConnection, который повторяет проверку достижимости.

Обновление: Хорошо, вы немного изменили свой вопрос. Причина, по которой вы получаете 5 сообщений «исчезли», состоит в том, что вы никогда не останавливаете уведомитель. Достижимость сохраняет себя в живых до тех пор, пока она бежит, поэтому устранение вашей ссылки не убивает ее. Вы должны явно сказать [internetReachableFoo stopNotifier] перед тем, как отключить его.

+0

Я знаю, поэтому я называю это 'didappear', но почему он называется 5 или 3 раза сразу, он должен вызывать один раз каждый' viewdidappear' –

+0

Если вы сомневаетесь, что это так, вы может подтвердить (или опровергнуть), что он вызывается этим методом, помещая «точку останова» в первую строку вашего метода testInternetConnection, а затем проверяя вкладку «Debug Navigator» (третий справа в навигационной панели слева), чтобы увидеть цепочку стека вызова метода. –

+0

@MordFustang: Хорошо, я обновил свой ответ, чтобы ответить на ваш отредактированный вопрос. –

Смежные вопросы