0

私の最初のView ControllerのviewDidLoadで、インターネット接続を確認し、利用可能な場合はダウンロードプロセスを開始します。

接続 (WiFi またはモバイル) またはインターネットが利用できない場合 - すべて問題ありません。ただし、デバイスがインターネットなしで WiFi に接続されている場合、アプリケーションはフリーズします。

if ([self isInternetAvail]) {
    [[Download sharedDownload] startUpdateProcessWithIndicatorInViewController:self];
}

これは機能です:

- (BOOL)isInternetAvail
{
    NSString *hostName = @"google.com";
    Reachability *hostReach = [Reachability reachabilityWithHostName:hostName];
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    if (netStatus == NotReachable) {
       return NO;
    } else {
       return YES;
    }
}

次の行でアプリケーションがフリーズします。

NetworkStatus netStatus = [hostReach currentReachabilityStatus];

インターネット接続を確認するより適切な方法は使用していますNSNotificationCenterが、この場合:

1) didFinishLaunchingWithOptions:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(networkStateChanged:)
                                             name:kReachabilityChangedNotification
                                           object:nil];

hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];
[hostReach startNotifier];
[self updateInternetAvailWithReachability: hostReach];

追加の方法:

- (void)updateInternetAvailWithReachability: (Reachability *)curReach
{
    netStatus = [curReach currentReachabilityStatus];  
}

- (void)networkStateChanged:(NSNotification *)notification
{
    Reachability *curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    [self updateInternetAvailWithReachability:curReach];
}

2)私の最初のView ControllerのviewDidLoadで:

AppDelegate *d = (AppDelegate *)[[UIApplication sharedApplication] delegate];
if (!d.netStatus == NotReachable) {
   [[Download sharedDownload] startUpdateProcessWithIndicatorInViewController:self];
}

このステップでNotReachableを取得し、ダウンロードを開始できません

3) NSNotificationCenter は、「インターネットが利用可能です」と教えてくれます

これを準備する方法についてアドバイスが必要です。

4

1 に答える 1

0

サーバーにリクエストしている場合は、timeoutInterval オプションを減らして最小値に設定し、リクエストが応答を取得するまで長く待たないようにします。これにより、アプリをフリーズする時間を短縮できます。それを完全に取り除きたい場合は、ネットワーク チェックのすべてのプロセスを別のスレッド (おそらくバックグラウンド スレッド) で実行する必要があります。

于 2013-06-25T10:37:03.603 に答える