【问题标题】:Setting up reachability with AFNetworking 2.0使用 AFNetworking 2.0 设置可达性
【发布时间】:2013-11-30 21:39:45
【问题描述】:

我正在尝试使用新的 2.0 AFNetworking 设置可达性。

在我的 AppDelegate 中,我初始化了 sharedManager。

// Instantiate Shared Manager
[AFNetworkReachabilityManager sharedManager];

然后在相关的 VC 方法中检查是否 isReachable:

// Double check with logging
if ([[AFNetworkReachabilityManager sharedManager] isReachable]) {
    NSLog(@"IS REACHABILE");
} else {
    NSLog(@"NOT REACHABLE");
}

目前这在模拟器中没有按预期工作,但我想这需要在设备而不是模拟器上进行测试。

问题 我想做的是监控 VC 内的连接。所以我在 viewDidLoad 中运行以下命令:

// Start monitoring the internet connection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

然后我将如何注册更改?一旦网络连接发生变化,我无法从文档中看到这一点。

【问题讨论】:

  • 仅供参考,您可以删除 AppDelegate 中的代码,您可以在其中实例化 sharedManager。 SharedManager 是一个 Singleton 对象,因此您可以直接使用它。当您第一次实际使用管理器执行与网络状态相关的任何操作时(isReachable、startMonitoring、setReachabilityStatusChangeBlock),Singleton 将返回一个新的或完全相同的实例。提前实例化它,就像你正在做的那样,并没有真正做任何有用的事情。
  • @djibouti33 - 你是对的,感谢那个地方。
  • 我可以使用 AFNetworking 库进行 swift 吗?

标签: ios ios6 afnetworking reachability afnetworking-2


【解决方案1】:

正如您在AFNetworking read me page 中看到的那样

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

这里还有a link to the official documentation

【讨论】:

  • 所以如果 startMonitoring 没有被调用,这个块就不会运行。例如,我只需将此块添加到 startMonitoring 下的 VC 的 viewDidLoad 中?
  • 是的,可以。 startMonitoring 将开始监控可达性状态(duh!),并且每当它发生变化时都会调用该块。
  • 谢谢,我知道这就是 startMonitoring 的意思,更多的是关于块以及应该在哪里调用它的问题。
【解决方案2】:

我有一个单例 AFHTTPRequestOperationManager 类。在单例中有一个方法:

+(void)connectedCompletionBlock:(void(^)(BOOL connected))block {

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    BOOL con = NO;
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

    if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {

        con = YES;
    }

    if (block) {
        [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
        block(con);
    }

}];

}

在发出请求之前,您调用此方法返回一个块,指示是否可以访问互联网:

[TLPRequestManager connectedCompletionBlock:^(BOOL connected) {
    if (connected) {

       // Make a request

    }else{

        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Notice" message:@"Internet is not available." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];

        [alertView show];

    }

}];

【讨论】:

    【解决方案3】:

    我只是在浏览您的问题和所有答案。在那之后,我决定把所有这些事情都做一次。因此,在我现有的项目中,我只是通过 cocoa-pods 包含了 AFNetworking,这是完全适合我的解决方案。

    解决方案——首先,AFNetworkReachabilityManager 是一个单例类。无需为 sharedManager 进行 AppDelegate 初始化。

    //[AFNetworkReachabilityManager sharedManager];
    
    #import <AFNetworkReachabilityManager.h>
    
    - (void)viewDidLoad {
    
    //Starting the network monitoring process
    
    [[AFNetworkReachabilityManager sharedManager]startMonitoring];
    
    //Checking the Internet connection...
    
    [[AFNetworkReachabilityManager sharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
        if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {
    
            UIAlertView *alertNetFound = [[UIAlertView alloc]initWithTitle:@"Network Found" message:@"Please Wait Until It is loading" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alertNetFound show];
    
        }else{
            UIAlertView *alertNetNotFound = [[UIAlertView alloc]initWithTitle:@"No Internet" message:@"Please Check Your Internet Connection Honey" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alertNetNotFound show];
        }
    }];
    

    因此,在这种情况下,每次设备连接到网络时,它都会先执行 startMonitoring 过程,然后每次都会点击状态块并根据状态显示警报。

    您可以通过替换状态块上的警报来根据您的选择做任何事情。我使用它从本地存储中自动加载网页,但为了简单起见,我删除了该代码。

    它甚至可以与我的模拟器和 Mac mini 一起使用..

    谢谢

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      我在应用程序委托中使用它 ->

       func reachablityCode() {
              AFNetworkReachabilityManager.sharedManager()
              AFNetworkReachabilityManager.sharedManager().startMonitoring()
              AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock({(status) in
                  let defaults = NSUserDefaults.standardUserDefaults()
                  if status == .NotReachable {
                      defaults.setBool(false, forKey:REACHABLE_KEY)
                  }
                  else {
                      defaults.setBool(false, forKey: REACHABLE_KEY)
                  }
                  defaults.synchronize()
              })
          }
      

      然后这个在基础文件中 ->

       func isReachable() -> Bool {
              return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多