2012-01-06 9 views
5

Xcode/RestKitにタブベースのアプリケーションを作成し、RKReachabilityObserverを使用してデバイスのインターネット接続を判断しようとしています。RestKitでRKReachabilityObserverを実装する最善の方法

理想的には、アプリケーション全体で到達可能な変数を1つ(これが可能であれば)にしたいと思っていますが、私の実装は以下のコード通りで、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

関連する問題