2012-11-06 3 views
5

내 응용 프로그램에서 Reachability를 구현하려고합니다. 나는 applicationDidFinishLaunching에있다. 내 연결이 정말 좋지 않아서 앱을 실행하면 Reachability가 영원히 걸리고 The application failed to launch in time 오류 메시지로 앱이 다운되는 경우가 있습니다.어디에서 Reachability에 전화를 걸립니까?

그래서 대신 백그라운드 스레드에서 Reachability에 대한 호출을 시도했습니다. 그러나이 작업을 수행 할 때 더 이상 도달 가능성 알림을받지 못합니다.

어디에서 도달 가능성을 호출해야합니까?

편집는 :

나는 아래의 제안에 따라 TonyMillions '도달 가능성의 코드를 추가,하지만 난 여전히 같은 application failed to load in time 오류가있을 때 아주 나쁜 네트워크 상태이다. 내가보고있는 것을 재현하려면 Settings.app -> Developer -> Network Link Conditioner로 가서 전원을 켜고 100 % 손실로 설정하십시오.

아직 앱이 해당 상태로로드됩니까?

답변

0

TonyMillion 날 GitHub에서이 작업을 통해 해결 도움이 호출됩니다 변경 그런 경우

self.reachability = [Reachability reachabilityForInternetConnection]; 

[self.reachability startNotifier]; 

을 아래 applicationDidFinishLaunching에 넣어 .

당신이 자신의 도달 가능성 교체를 사용하는 경우, 당신이해야 할 모든 그래서 같은 startNotifier 전화를 포장한다 :

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    [self.internetReach startNotifier]; 
}); 

응용 나쁜 네트워크 상태에서 시작 실패하지 않습니다, 당신은거야 여전히 주 스레드에서 알림을받습니다.

0

그래서 대신 Reachability에 대한 호출을 백그라운드 스레드에 넣습니다. 그러나 내가이 작업을 수행 할 때 더 이상 도달 가능성 알림을받지 못합니다.

백그라운드 스레드에서 도달 가능성을 호출하면 백그라운드 실행 루프에서 도달 가능성을 예약하고 백그라운드 스레드 runloop이 실행 중인지 확인해야합니다.

는 배경 스레드에서 실행된다 :

  1. 가 reachbility 객체를 생성

    도달 가능성 도달 * = [reachabilityWithHostName 도달 가능성을 @ "www.google.com을"];

  2. [reachability startNotifier];

  3. [[NSRunLoop currentRunLoop] run];

주 스레드의 스케줄러 알리는 권장됩니다.

2

Github의 Tony Millions reachability 프로젝트를 사용하십시오. 그런 다음

https://github.com/tonymillion/Reachability

내 애플 대리자에서 난 그냥 상태가이

#pragma mark - Reachability 

- (void)reachabilityChanged:(NSNotification *)note { 

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus]; 

    if (ns == NotReachable) { 

     if (![self.networkAlert isVisible]) { 

      if ([self networkAlert] == nil) { 

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to communicate with the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil]; 
       [self setNetworkAlert:alert]; 
      } 

      [self.networkAlert show]; 
     } 
    } else { 

     if ([self networkAlert] != nil) { 

      [self.networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
     } 
    } 
} 
+0

마침내 이제이 문제를 다시 테스트하고 있습니다. 나는 TonyMillions의 Reachability 코드를 추가했는데, 여전히 매우 나쁜 네트워크 상태에서 동일한'application in time in load '오류를 얻고있다. Settings.app -> Developer -> Network Link Conditioner로 가서 전원을 켜고 100 % 손실로 설정하십시오. 앱이 여전히 그 상태로로드됩니까? – bmueller

+0

예. 전혀 문제 없습니다 ... 물론 네트워크 장애는 제외하고 ... – Hackmodford

관련 문제