Swift - 可达性崩溃

Posted

技术标签:

【中文标题】Swift - 可达性崩溃【英文标题】:Swift - Crashing With Reachability 【发布时间】:2016-04-21 21:18:00 【问题描述】:

当按下 UIButton 以在完成操作之前检查 Internet 连接时,我调用方法 testReachability()。这是使用 Ashley Mill 的可达性类。

在第 24 行,我调用了 completed(),这样如果应用程序可以访问网络,那么它将完成关闭并继续执行其余操作。但是应用程序会出现故障,并且此错误会显示在调试控制台中:

“此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。”

如果我在第 26 行调用 completed(),那么应用程序运行完美、快速、流畅,直到我失去互联网连接/进入飞行模式。然后应用程序立即崩溃,xcode 在点击按钮时失去与设备的连接。

我的问题是在检查可达性时我可以做些什么来解决我的应用程序崩溃的问题。

func testReachability(completed: DownloadComplete)

    let reachability: Reachability
    do 
        reachability = try Reachability.reachabilityForInternetConnection()
     catch 
        return
    

    reachability.whenReachable =  reachability in
        // this is called on a background thread, but UI updates must
        // be on the main thread, like this:
        dispatch_async(dispatch_get_main_queue())
        
            if reachability.isReachableViaWiFi()
            
                print("Reachable via WiFi")
            
            else
            
                print("Reachable via Cellular")
            
        
        completed()
    

    reachability.whenUnreachable =  reachability in
        // this is called on a background thread, but UI updates must
        // be on the main thread, like this:
        dispatch_async(dispatch_get_main_queue())
        
           self.presentReachabilityAlertController()
        
    

    do
    
        try reachability.startNotifier()
    
    catch
    

    


func presentReachabilityAlertController()

    let alert = UIAlertController( title: "Network Connection Lost", message:"Try Again", preferredStyle: .Alert)
    alert.addAction(UIAlertAction( title: "ok"  , style: .Default)  _ in  )
    presentViewController        ( alert, animated: true                   )       
    connected = false

【问题讨论】:

请将代码的相关部分作为文本而不是图像添加到您的问题中。 见***.com/editing-help @JAL 抱歉,立即修复 【参考方案1】:

听起来完成的调用需要在主线程上执行。在dispatch_async(dispatch_get_main_queue()) 内部时会这样做。尝试在 dispatch_async 中调用完成,如下所示:

dispatch_async(dispatch_get_main_queue())

    if reachability.isReachableViaWiFi()
    
        print("Reachable via WiFi")
    
    else
    
        print("Reachable via Cellular")
    
    complete()   

如果这不能解决您处于飞行模式/离线时的情况,我认为我们将需要更多代码来帮助您解决问题。如果您可以展示如何/何时调用此函数、完整的回调,甚至可能是 presentReachabilityAlertController 函数,那将会很有帮助。

【讨论】:

我很抱歉,我相信这个错误现在已经修复了!从第一次测试开始,它似乎就是解决方案!

以上是关于Swift - 可达性崩溃的主要内容,如果未能解决你的问题,请参考以下文章

检查iphone中的网络可达性后应用程序崩溃?

Swift 中的 AFNetworking 可达性管理器

Swift 3 通过可达性检查互联网连接

使用 SWIFT 检查 IP 地址可达性

在 Swift 5 中使用可达性 [重复]

Swift 4 中的可达性问题