2016-04-21 2 views
0

Я вызываю метод testReachability(), когда UIButton нажата для проверки подключения к Интернету, прежде чем он завершит действие. Это использует класс достижимости Эшли Милл.Swift - сбой с достижимостью

On Line 24 Я вызываю завершенный(), так что, если приложение может достичь сети, оно завершит закрытие и продолжит действие остальной части действия. Однако приложение становится глючным, и эта ошибка отображается в консоли отладки:

«Это приложение модифицирует механизм автозапуска из фонового потока, что может привести к повреждению двигателя и странным сбоям. Это приведет к исключению в будущей версии . »

И если я позвоню завершен(), скажем, строка 26, приложение работает безупречно, быстро и плавно, пока я не потеряю подключение к Интернету/не войду в режим полета. Затем приложение мгновенно сработает, а 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 
} 
+0

Пожалуйста, добавьте соответствующие части кода в свой вопрос как текст, а не как изображение. – JAL

+0

См. Http://stackoverflow.com/editing-help – jtbandes

+0

@JAL мои извинения, исправлены немедленно – lifewithelliott

ответ

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.

+0

Мои извинения Я верю, что исправлена ​​ошибка! От первого тестирования это решение! – lifewithelliott

Смежные вопросы