【问题标题】:How to check for internet connection synchronously?如何同步检查互联网连接?
【发布时间】:2014-08-23 12:33:22
【问题描述】:

如何同步检查网络?我希望网络检查阻塞调用线程并返回正确的结果

我尝试了tonymillion's ReachabilityAFNetworkReachabilityManager,但它们都使用回调块。表示回调前可达状态未知。

我想检查applicationDidFinishLaunchingWithOptions: 的网络,但此时可达性为AFNetworkReachabilityStatusUnknown (AFNetworkReachabilityManager) 或不可靠(tonymillion 的可达性)

我看到唯一的方法是针对某些主机(例如 google.com)执行 NSURLConnection,例如 Check for internet connection - iOS SDK

有没有更好的办法?

【问题讨论】:

  • 您可以随时查看 currentReachabilityStatus 属性,而无需开始监控。
  • 小心阻塞applicationDidFinishLaunchingWithOptions中的线程。如果您阻止它太久,应用程序将自动关闭。
  • @LyricalPanda 感谢您的建议,并为这样糟糕的例子感到抱歉 :) 只关注问题

标签: ios connection afnetworking reachability


【解决方案1】:

回答我自己的问题:它是可靠的

阅读此Technical Q&A QA1693 Synchronous Networking On The Main Thread

reachability — 系统配置框架可达性 API ()同步操作 默认。因此,看似无害的例程,如 SCNetworkReachabilityGetFlags 可以让你被看门狗杀死。如果 您正在使用可达性 API,您应该异步使用它。 这涉及使用 SCNetworkReachabilityScheduleWithRunLoop 在运行循环中安排可达性查询的例程

所以我们可以像这样使用它iOS: Check whether internet connection is available

- (BOOL) isConnectionAvailable
{
    SCNetworkReachabilityFlags flags;
        BOOL receivedFlags;

        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(CFAllocatorGetDefault(), [@"dipinkrishna.com" UTF8String]);
        receivedFlags = SCNetworkReachabilityGetFlags(reachability, &flags);
        CFRelease(reachability);

        if (!receivedFlags || (flags == 0) )
        {
            return FALSE;
        } else {
        return TRUE;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2011-04-15
    • 2017-03-16
    • 2014-02-08
    • 2012-06-12
    相关资源
    最近更新 更多