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 번 및 종료 인터넷 말할 수 있습니다. 난 당신이 내가 internetReachableFoo= nil;
을 추가 한하지만 난 아무것도 변경 나던 볼 수있는 그
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
nslog에 참조하십시오.
위의 코드에서 무슨 일이 발생합니까? 여러 번 호출되는 이유는 무엇입니까?
이 블록을 사용할 때 발생할 수있는 위험은 무엇입니까?
나는 왜 그것을 'didappear'라고 부르는 지 알지만, 왜 그것이 한 번에 5 번이나 3 번 불리는 이유는 'viewdidappear'를 한 번 호출하면되는 것입니다. –
이것이 사실이 아니라고 의심한다면 'testInternetConnection' 메쏘드의 첫번째 줄에'중단 점 (breakpoint) '을 놓고 왼쪽의 탐색 창에서 오른쪽에서 세 번째로'Debug Navigator' 탭을 체크함으로써이 메소드에 의해 호출되고 있음을 확인 (또는 증명할 수 있습니다.) 메서드 호출 스택 체인을 볼 수 있습니다. –
@MordFustang : Ok. 편집 한 질문에 대한 답을 업데이트했습니다. –