1

我试图弄清楚如何使用 AFNetworking 2 和可达性显示“无互联网连接”警报。

我将 Reachability 和 AFNetworking 导入到我的控制器中。我从 AFNetworking 2 文档中复制的代码部分开始,AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];我不确定它是否属于它。

更新

我的应用程序现在会在没有互联网连接时显示警报,但是警报显示需要很长时间,我也怀疑这是我构建代码的最佳方式。(另外,如果我在主视图控制器上,并且在没有连接时单击一个单元格,应用程序崩溃,我不知道是否有办法解决这个问题)。

- (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 回答
1

如果您使用的是 AFNetworking 3.0,请在 ViewDidLoad 或您的 AppDelegate 上调用此代码:

// Monitoring Reachability
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

    // Add your alert here
}];

[[AFNetworkReachabilityManager sharedManager] startMonitoring];
于 2016-01-26T12:50:26.643 回答
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 回答