2013-07-15 5 views
1

До сих пор произошло только один раз.Основная нить заблокирована на SCNetworkReachabilityGetFlags

Я использую библиотеку третьей стороны, и вызывает функцию ниже:

- (BOOL) isReachableViaWiFi { 

    NSAssert(reachabilityRef, @"isReachableViaWiFi called with NULL reachabilityRef"); 

    SCNetworkReachabilityFlags flags = 0; 
    NetworkStatus status = NotReachable; 

    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) { 
     status = [self networkStatusForFlags: flags]; 
     return (ReachableViaWiFi == status); 
    } 

    return NO; 

} // isReachableViaWiFi 

Когда я нахожу мой UI остановился, я приостановил выполнение программы, и каждый раз, когда он останавливается на SCNetworkReachabilityGetFlags линии:

enter image description here

enter image description here

Я запутался об этом. Спасибо за любые советы.

ответ

3

Основываясь на коде, который вы опубликовали, я бы сказал, что ваша проблема заключается в том, что вы синхронно вызываете SCNetworkReachabilityGetFlags в основной теме. Я думаю, что есть большая вероятность, что эта функция что-то скажет в Интернете. Если удаленный хост, пытающийся выполнить ping, по какой-либо причине недоступен (вы потеряли интернет-соединение), вы получите обычные сетевые тайм-ауты, которые могут быть очень длинными (30 секунд). На этот раз вы заблокируете основной поток (со всем пользовательским интерфейсом).

Таким образом, решение проблемы может быть: вызвать эту функцию в другой очереди/потоке, а затем передать результат в ваш основной поток. Делая это, вы не блокируете основной поток, ожидая ответа на удаленный хост.

В общем, вам следует избегать запуска любого сетевого кода взаимодействия в основном потоке.

+0

Спасибо. Он вызывается сторонней библиотекой, а основной поток блокируется более 1 минуты. –

+0

Другая вещь, о которой я могу думать, - это runloop, в котором живет сеть. Он может быть заблокирован чем-то или может быть неправильно настроен. – user1264176

+1

Есть хорошая статья Майка Эша - [link] (http://mikeash.com/pyblog/friday-qa-2013-06-14-reachability.html). Замечания к нему тоже замечательные, я рекомендую их также прочитать. – user1264176

1

Образец Повторяемость демонстрирует асинхронное использование API SCNetworkReachability. Вы можете использовать API синхронно, но не делайте синхронную проверку hostName в основном потоке. Если устройство не может добраться до DNS-сервера или находится в медленной сети, синхронный вызов функции SCNetworkReachabilityGetFlags может блокировать до 30 секунд, пытаясь разрешить имя узла. Если это произойдет в основном потоке, сторожевой таймер приложения убьет приложение через 20 секунд бездействия.

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