2013-10-02 7 views
0

인터넷 연결이 가능한지 확인해야하는 iOS 앱을 개발 중이며 여러 ViewController 클래스가 있습니다. 네트워크 연결을 확인하려면 (Reachability library by Tony Million)을 사용하고 있습니다.AppDelegate의 Reachibility 블록을 사용하여 앱 전체의 연결을 확인하십시오.

내가 지금하고있는 일이 여기에 있습니다. 연결 검사를 필요로하는의 ViewController 클래스에서 나는 ....있는 viewDidLoad에서

Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; 
reach.reachableBlock = ^(Reachability*reach) 
{ 
    NSLog(@"REACHABLE!"); // Load offline data from core data 
}; 

reach.unreachableBlock = ^(Reachability*reach) 
{ 
    NSLog(@"UNREACHABLE!"); // Fetch data from Rest Api 
}; 

[reach startNotifier]; 

을이 코드 블록을 사용하고 그러나 네트워크 상태 변화와 내 애플 리케이션이의 ViewController에있을 때 가끔 가져 오는처럼, 예상치 못한 행동을 데 API의 데이터가 반복적으로 반복됩니다. 나는 내가 코드에 잘못을했는지 확신 할 수 없으므로 전문가의 의견을 기다리고 있습니다.

어쨌든이 문제를 해결하고 코드를보다 깨끗하고 안정하게 만들 수있는 대체 솔루션을 찾고 있습니다. 나는 그것이 좋은 접근인지 전문가들로부터 알고 싶다. isNetworkConnected라는 AppDelegate에 BOOL Variable을 유지하고 싶습니다. 그런 다음 - (BOOL) 응용 프로그램 : (UIApplication *) 응용 프로그램 didFinishLaunchingWithOptions : (NSDictionary *) launchOptions, 위의 코드를 실행하고 그 안에 isNetworkConnected YES/NO 변수를 설정하고 싶습니다. 그래서 코드는

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; 
    reach.reachableBlock = ^(Reachability*reach) 
    { 
     NSLog(@"REACHABLE!"); 
     isNetworkConnected = YES ; 
    }; 

    reach.unreachableBlock = ^(Reachability*reach) 
    { 
     NSLog(@"UNREACHABLE!"); 
     isNetworkConnected = NO ; 
    }; 

    [reach startNotifier]; 

    // rest codes.... 
} 

그런 내의 ViewController에, 나는 ...이처럼의

if(appdelegate.isNetworkConnected == YES){ 
    // Fetch data from api 
} else{ 
    // Load offline data from Core data 
} 

을 다하겠습니다 ... 이렇게 될 것입니다. 나는 나의 생각이 좋은지 나쁜지를 알고 싶다. 어떤 실수를하고 있거나 더 좋은 제안이 있다면 매우 감사 할 것이다. 미리 감사드립니다.

+1

이 답변을 확인하십시오. 모든 viewController에서 연결 가능성을 확인할 수 있습니다. http://stackoverflow.com/questions/1083701/how-to-check-for-an-active-internet-connection-on-iphone-sdk – nsgulliver

+0

감사합니다. 이전에 이미 살펴 보았습니다. 그리고 나는 거기에서 가장 득표 한 대답에서 위의 해결책을 사용하고 있습니다. 나는 단지 모든 가변적 인 블록을 모든 ViewController에서 사용할 필요가 없도록 연결 변수 Gloabal을 앱에서 만들려고 노력하고 있습니다. – ayon

답변

0

AppDelegate.h 파일에서 1 Bool varible을 정의하고 클래스 전체에서이 Bool을 확인하십시오. 인터넷 연결이 Bool에 있는지 확인하십시오. 인터넷에 연결할 수 없으면 bool이 거짓입니다.

및 themn은 bool wher를 원하는지 확인합니다.

+0

이것은 정확히 내 질문에 위에서 설명한 솔루션입니다. 친절하게 제 코드를 확인하고 제가 잘못하고 있는지 알려주십시오. 귀하의 답변에 감사드립니다. – ayon

1

아래 코드를 사용해보십시오.

AppDelegate.h에서 다음과 같은 방법을 사용하십시오.

-(void)checkNetConnection { 

    bool success = false; 
    const char *host_name = [@"http://stackoverflow.com" 
          cStringUsingEncoding:NSASCIIStringEncoding]; 

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); 
    SCNetworkReachabilityFlags flags; 
    success = SCNetworkReachabilityGetFlags(reachability, &flags); 
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
    !(flags & kSCNetworkFlagsConnectionRequired); 

    [[NSUserDefaults standardUserDefaults]setBool:isAvailable forKey:@"ISNETAVAILABLE"]; 
} 

통화 application didFinishLaunchingWithOptions에서이 방법

[자기 checkNetConnection];

다른보기 컨트롤에서 그냥 간단히 확인하려면 다음과 같이 Bool 변수를 정의하십시오.

bool isAvailable = [[NSUserDefaults standardUserDefaults]boolForKey:@"ISNETAVAILABLE"]; 

if (isAvailable) { 

    // do what you want to do if internet is available. 

} 

else { 

    // internet is not available. 

} 

희망이 도움이 될 것입니다.