インターネット接続が利用可能かどうかをいくつかのViewControllerクラスで確認する必要があるiOSアプリを開発しています。ネットワーク接続を確認するために、私は ( Tony Million による Reachability ライブラリ) を使用しています。
これが私が今していることです。接続チェックが必要な 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 変数を保持したいと考えています。次に、 - (BOOL)application:(UIApplication *)application 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
}
それでおしまい。私のアイデアが良いか悪いかを知りたいのですが、間違いやより良い提案があれば、高く評価されます。前もって感謝します。