2013-04-01 2 views
0

Reachabilitydispatch_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 번 및 종료 인터넷 말할 수 있습니다. 난 당신이 내가 internetReachableFoo= nil;을 추가 한하지만 난 아무것도 변경 나던 볼 수있는 그

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

nslog에 참조하십시오.

위의 코드에서 무슨 일이 발생합니까? 여러 번 호출되는 이유는 무엇입니까?

이 블록을 사용할 때 발생할 수있는 위험은 무엇입니까?

답변

4

자식을 팝업 할 때마다 루트는 -viewDidAppear:을 얻고 도달 가능성 테스트를 다시 실행하기 때문에 -testInternetConnection을 호출하기 때문에 여러 번 호출됩니다.

업데이트 : 질문을 변경했습니다. 알리미를 절대 멈추지 않으므로 5 가지 "사라진"메시지가 나타나는 이유가 있습니다. Reachability는 실행되는 동안 자체를 유지하므로 참조를 작성하면 죽이지 않습니다. 밖으로 진술하기 전에 명시 적으로 [internetReachableFoo stopNotifier]라고 말해야합니다.

+0

나는 왜 그것을 'didappear'라고 부르는 지 알지만, 왜 그것이 한 번에 5 번이나 3 번 불리는 이유는 'viewdidappear'를 한 번 호출하면되는 것입니다. –

+0

이것이 사실이 아니라고 의심한다면 'testInternetConnection' 메쏘드의 첫번째 줄에'중단 점 (breakpoint) '을 놓고 왼쪽의 탐색 창에서 오른쪽에서 세 번째로'Debug Navigator' 탭을 체크함으로써이 메소드에 의해 호출되고 있음을 확인 (또는 증명할 수 있습니다.) 메서드 호출 스택 체인을 볼 수 있습니다. –

+0

@MordFustang : Ok. 편집 한 질문에 대한 답을 업데이트했습니다. –