Сценарий AFNetworking и отсутствие подключения к Интернету - PullRequest
23 голосов
/ 13 февраля 2012

Я использую AFNetworking в своем приложении для каждого запроса (например, для входа в систему, получения данных из URL и т. Д.).

Возьмем для примера: пользователь нажимает на кнопку входа в систему, и соединение отсутствует, как мгновенно отобразить UIAlertView с сообщением об ошибке? Способ only состоит в ожидании тайм-аута запроса и выполнении блока failure? Разве нет способа мгновенно проверить, есть ли соединение или нет?

Спасибо!

Ответы [ 5 ]

57 голосов
/ 13 февраля 2012

Начиная с 0.9, AFHTTPClient фактически имеет встроенную достижимость сети (более простой интерфейс к вышеупомянутому коду доступа Apple).Просто включите структуру SystemConfiguration и используйте -setReachabilityStatusChangeBlock:, чтобы указать ответ при изменении состояния достижимости.

28 голосов
/ 23 июля 2012

С AFNetworking это шаги, которые необходимо выполнить, чтобы воспользоваться setReachabilityStatusChangeBlock: после добавления классов AFNetworing -

  1. Добавить SystemConfiguration.framework в ваш проект
  2. В pch файл добавить #import <SystemConfiguration/SystemConfiguration.h>
  3. Предполагая, что у вас есть подкласс AFHTTPClient в этом подклассе, добавьте ниже строки кода в функцию init -
[self setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        NSLog(@"changed %d", status);
        //your code here
    }];
2 голосов
/ 20 ноября 2013

Я использую AFNetworkingOperationDidFinishNotification. Каждый раз, когда http-запрос не выполняется, всплывает предупреждение и информирует пользователя

- (void)addNetworkObserver
{
   [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(HTTPOperationDidFinish:) 
                                                name:AFNetworkingOperationDidFinishNotification 
                                              object:nil];
}

- (void)HTTPOperationDidFinish:(NSNotification *)notification 
{
   AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)[notification object];
   if (![operation isKindOfClass:[AFHTTPRequestOperation class]]) {
       return;
   }
   if (operation.error) {
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection error"
                                                       message:@"Missing connection to the internet"
                                                      delegate:nil
                                             cancelButtonTitle:@"OK"
                                             otherButtonTitles:nil];

       [alert show];
   }
}
2 голосов
/ 13 февраля 2012

Возможно, вы могли бы использовать «Reachability», чтобы определить, подключено ли устройство к сети.Вот ссылка на Apple Doc.: Достижимость

Например:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if(remoteHostStatus == NotReachable) {
  //Your UIAlertView
}
0 голосов
/ 13 февраля 2012

Как насчет использования Достижимость?

Вы можете проверить, есть ли у вас правдоподобная причина для попытки подключения, прежде чем сделать это.

Похоже, что Пример проекта Apple для достижения доступности показывает, как получить начальный статус.

...