2012-01-06 1 views
5

Xcode/RestKit에 탭 기반 응용 프로그램을 작성했으며 RKReachabilityObserver를 사용하여 장치의 인터넷 연결을 확인하려고합니다.RestKit에서 RKReachabilityObserver를 구현하는 가장 좋은 방법

내 응용 프로그램 전체에서 단일 도달 가능성 변수를 갖고 싶습니다 (가능하면 가능).하지만 현재 구현은 아래 코드와 같으며 내 4 개의 탭에 복제 할 때 제대로 작동하지 않습니다.

아무에게도이 작업을 수행 할 수있는 더 좋은 방법이 있다면 정말 감사드립니다.

View.h

@property (nonatomic, retain) RKReachabilityObserver *observer; 

View.m 다음

@interface AppViewController() 
{ 
    RKReachabilityObserver *_observer; 
} 
@property (nonatomic) BOOL networkIsAvailable; 
@synthesize observer = _observer; 

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if ((self = [super initWithCoder:aDecoder])) { 

     self.observer = [[RKReachabilityObserver alloc] initWithHost:@"mydomain"]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(reachabilityChanged:) 
                name:RKReachabilityDidChangeNotification 
                object:_observer]; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // determine network availability 
    if (! [_observer isReachabilityDetermined]) { 
     _networkIsAvailable = YES; 
    } 
    else 
    { 
     _networkIsAvailable = NO; 
    } 

    _text.returnKeyType = UIReturnKeyDone; 
    _text.delegate = self; 
} 

- (void)reachabilityChanged:(NSNotification *)notification { 
    RKReachabilityObserver* observer = (RKReachabilityObserver *) [notification object]; 
    if ([observer isNetworkReachable]) { 
     if ([observer isConnectionRequired]) { 
      _networkIsAvailable = YES; 
      NSLog(@"Reachable"); 
      return; 
     } 
    } 
    else 
    { 
     _networkIsAvailable = NO; 
     NSLog(@"Not reachable"); 
    } 
} 

어디서나 내보기에, 나는 단순히 할 ....

if (_networkIsAvailable == YES) 
    {... 

내가 가진 여러보기에서이를 구현했습니다. 문제를 일으킨다.

다중보기 응용 프로그램에 대해 제안 된 접근 방식은 무엇입니까?

답변

18

[RKClient sharedClient] 싱글 톤에는 이미 해당 속성 (reachabilityObserver)이 있습니다. 자유롭게 사용하십시오. 여기

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(reachabilityStatusChanged:) 
               name:RKReachabilityDidChangeNotification object:nil]; 
+0

나는 싱글 톤을 대신 사용했으며 완벽하게 작동합니다. 감사. – Nick

+0

안녕하세요. 선택한 호스트를 sharedClient 싱글 톤으로 만지는 방법이 있습니까? 또한, 최초로드 시간은 약 2 초입니다. 이게 정상인가? – Nick

+0

도달 가능성 API와 관련하여 iOS5에 몇 가지 문제가있었습니다. 가능한 한 baseURL을 IP 주소로 정의하면 RestKit에서 IP를 사용하여 상태를 확인합니다. 문제는 도달 상태를 결정할 때 iOS가 DNS 요청을 처리하는 방식과 관련이 있습니다. 예, 다소 지연 될 수 있습니다. 디바이스 또는 시뮬레이터에서 테스트 중입니까? 장치가 있다면, iOS에는 무엇이 있습니까 (또한 Edge/3G/WiFi 연결성) – mja

2

나중에 RestKit 0.20에서 약간의 변화이다 (도달 가능성 상태 변경 때 모든 작업을 수행 할 경우)

if ([[[RKClient sharedClient] reachabilityObserver] isReachabilityDetermined] && [[RKClient sharedClient] isNetworkReachable]) { 
    .... 
} 

는 또한 RKReachabilityObserver 알림에 가입 할 수 있습니다. 도달 가능성 블록 코드는 다음과 같아야합니다.

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[RemoteTools serverUrl]]; 
[manager.HTTPClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
    if (status == AFNetworkReachabilityStatusNotReachable) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No network connection" 
                 message:@"You must be connected to the internet to use this app." 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 
    } 
}]; 
+0

한 번 구현하여 모든 화면에서 동일한 작업을 수행 할 수있는 방법이 있습니까? – jonypz

+0

관리자 용으로 한번 구현 한 다음 [RKObjectManager sharedManager]로 사용하십시오. 따라서 구현 된 도달 가능성 블록이있는 동일한 관리자를 사용할 수 있습니다. – CTiPKA