【问题标题】:Reachability iOS可达性 iOS
【发布时间】:2014-05-28 16:05:39
【问题描述】:

我有一个 TableView,它使用方法调用 retrieveData 从服务器接收数据。 我使用可达性来测试用户是否有互联网连接。 如果是,则调用 retrieveData。 如果不是,我会打印 NSLog。

一切正常,但是.. 即使它有连接,表格也需要几秒钟才能加载,这不是我想要的。 我怎么能马上?

我在 viewDidLoad 方法中检查连接。

- (void)viewDidLoad
{
    [super viewDidLoad];

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

    reach.reachableBlock = ^(Reachability*reach)
    {
        // Load the Table Content
        [self retrieveData];
    };

    reach.unreachableBlock = ^(Reachability*reach)
    {
        NSLog(@"no internet");
    };

    [reach startNotifier];

}

【问题讨论】:

  • 如果Reachability 立即返回,这似乎是一个表格视图加载问题。在你的代码中探索需要时间的地方。
  • 你为什么要使用可达性?这更有助于了解用户何时转换为在线或从在线转换。如果无论如何都要显示表格视图,只需进行网络连接并在错误返回时处理错误。听起来您实际上是在问“如何在零秒内获取网络数据?”
  • @Tommy 我只想检查与的连接,如果是,则加载表,如果不是。为用户发送通知。

标签: ios uitableview reachability


【解决方案1】:

即使 Google 网站“最有可能”不会关闭,但从理论上讲,依靠主机名的可访问性来确定连接性是一个坏主意。

一旦您拥有downloaded 并导入Reachbility.mReachbility.h 文件

创建一个辅助函数:

-(BOOL)IsConnected{
  Reachability *reachability = [Reachability reachabilityForInternetConnection];
  NetworkStatus networkStatus = [reachability currentReachabilityStatus];

  return !(networkStatus == NotReachable);    
}

那就用吧

if([self IsConnected]){
 [self retrieveData];
}
else{
  //not connected to internet!
}

【讨论】:

  • 也感谢@meda
【解决方案2】:

数据加载需要时间。如果你想立即显示你的数据,你应该在显示你的视图控制器之前加载它。

【讨论】:

  • 但是如果我加载内容而不使用任何方法检查连接,则立即加载表。所以我认为问题在于这种检查方法。
  • 可达性应该到达谷歌主机。所以需要更多的时间。尝试在之前加载数据,如果无法加载,请启动 Reachability。
【解决方案3】:

与其在视图控制器中使用 Reachability (它必须在视图加载时验证连接状态),不如将其移动到始终跟踪连接状态的 AppDelegate 中。然后,当您的视图控制器加载时,只需检查现有可达性的状态并采取任何适当的操作。

澄清一下,您现在看到的延迟是 Reachability 尝试建立与 google.com 的连接,这需要一些有限的时间。通过将可达性处理移动到您的应用程序委托中,您可以预先加载该过程,以便它在应用程序加载过程中发生。

在您的 AppDelegate.h 中添加:

@property (nonatomic, strong, readonly) Reachability* reachability;

在您的 AppDelegate.m 文件中,在 applicationDidFinishLaunching 添加:

_reachability = [Reachability reachabilityWithHostname:@"www.google.com"];
[_reachability startNotifier];

然后,您可以通过以下方式检查可达性:

AppDelegate* appDelegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
if(appDelegate.reachability.isReachable) {
    ...
}

【讨论】:

  • 对不起,我是开发新手。我将 Reachability 放在 AppDelegate 的 didFinishLaunchingWithOptions 方法中。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { Reachability *reachability = [ReachabilityreachabilityWithHostname:@"www.google.com"]; [可达性 startNotifier];返回是;但是我如何检查我的 didViewLoad 中现有可达性的状态来调用加载数据的方法?
【解决方案4】:
-(void)checkNetworkStatus{
    Reachability* internetAvailable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStatus = [internetAvailable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:{
            NSLog(@"The internet is down.");
            break;
        }case ReachableViaWiFi:{
            NSLog(@"The internet is working via WIFI.");
            break;
        }case ReachableViaWWAN:{
            NSLog(@"The internet is working via WWAN.");
            break;
        }
    }
}

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多