1

AFNetworking 2 と Reachability を使用して「インターネット接続なし」アラートを表示する方法を見つけようとしています。

コントローラに Reachability と AFNetworking をインポートしました。AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];AFNetworking 2 のドキュメントからコピーした Iで始まるコードの部分は、それがどこに属するのかわかりません。

アップデート

インターネットに接続されていないときはいつでもアプリにアラートが表示されるようになりましたが、アラートが表示されるまでに時間がかかりすぎます。また、これがコードを構築するための最良の方法であるとは思えません。(また、メイン ビュー コントローラーを使用していて、アプリがクラッシュする接続がないときにセルをクリックすると、これを修正する方法があるかどうかわかりません)。

- (void)viewDidLoad

{
    [super viewDidLoad];

    Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"];

    reach.reachableBlock = ^(Reachability * reachability)
    {
        NSLog(@"Reachable");
    };

    reach.unreachableBlock = ^(Reachability * reachability)
    {
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"No internet connection"
                                                         message:@"No internet connection"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
        [alert show];
        NSLog(@"Not Reachable");
    };

    [reach startNotifier];

    self.upcomingReleases = [[NSMutableArray alloc] init];

    [self makeReleasesRequests];

    self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; // Make nav items white

    [self.collectionView registerClass:[ReleaseCell class] forCellWithReuseIdentifier:@"ReleaseCell"];
}

-(void)makeReleasesRequests
{
    NSURL *url = [NSURL URLWithString:@"http://www.soleresource.com/upcoming.json"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"@");

        self.upcomingReleases = [responseObject objectForKey:@"upcoming_releases"];

        [self.collectionView reloadData];

    } failure:nil];

    [operation start];

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];

    NSOperationQueue *operationQueue = manager.operationQueue;
    [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
            case AFNetworkReachabilityStatusReachableViaWiFi:
                [operationQueue setSuspended:NO];
                break;
            case AFNetworkReachabilityStatusNotReachable:
            default:
                [operationQueue setSuspended:YES];
                break;
        }
    }];

}

ありがとう。

4

5 に答える 5

5

AFNetworkingOperationDidFinishNotificationを使用します。http 要求が失敗するたびに、アラートがポップアップしてユーザーに通知されます。

- (void)addNetworkObserver
{
   [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(HTTPOperationDidFinish:) 
                                                name:AFNetworkingOperationDidFinishNotification 
                                              object:nil];
}

- (void)HTTPOperationDidFinish:(NSNotification *)notification 
{
   AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)[notification object];
   if (![operation isKindOfClass:[AFHTTPRequestOperation class]]) {
       return;
   }
   if (operation.error) {
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection error"
                                                       message:@"Missing connection to the internet"
                                                      delegate:nil
                                             cancelButtonTitle:@"OK"
                                             otherButtonTitles:nil];

       [alert show];
   }
}
于 2013-11-20T14:11:03.933 に答える
1

まったく同じ問題がありました。[alert show] を削除してメイン スレッドに追加する必要があるため、次のようになります。

 UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"No internet connection"
                                                         message:@"No internet connection"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
       // [alert show];
        NSLog(@"Not Reachable");
        [alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
于 2013-11-25T23:57:43.537 に答える
0

到達可能性でこれを試してください

Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"];

reach.reachableBlock = ^(Reachability * reachability)
{
  UIAlertView *alrt=[[UIAlertView alloc]initWithTitle:@"Title" message:@"Reachable" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];

  [alrt performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:yes];  
};

reach.unreachableBlock = ^(Reachability * reachability)
{
  UIAlertView *alrt=[[UIAlertView alloc]initWithTitle:@"Title" message:@"Not Reachable" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];

  [alrt performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:yes];  
 };


[reach startNotifier];
于 2013-11-14T19:04:53.713 に答える
0

reachabilityManager で startMonitoring を呼び出していることを確認してください (AFNetworking 2 に組み込まれているものを使用してください。この場合、Reachability の追加は冗長です)。

[manager.reachabilityManager startMonitoring]

デバイスまたはシミュレーターで機内モードのオン/オフを切り替えて、これをテストできます。これは、タイムアウト/遅い接続/不正なリクエストのケースを処理しないことに注意してください。それはあなたがこれと一緒に処理しなければならないものです。

于 2014-02-24T15:35:04.280 に答える