0

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

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

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

如果我在第 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
}
4

1 回答 1

0

听起来完成的调用需要在主线程上执行。它会在里面时这样做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可能会有所帮助的函数。

于 2016-04-21T21:43:41.510 回答