2013-02-23 3 views
19

Я реализовал AFNetworking без подклассов AFHTTPClient, частично используя следующий код в моем DownloadQueueManager:AFNetworking проверка доступности

-(void)downloadPodcastAt:(NSString *)url toPath:(NSString *)path 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] 
              cachePolicy:NSURLRequestReturnCacheDataElseLoad 
             timeoutInterval:60.0]; 
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     [self saveQueuedItemInformation]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     // Other stuff 
    }]; 

    [operation start]; 
} 

Мой вопрос многогранен. Я googled до тех пор, пока мои пальцы не онемели и еще не нашли достойный образец кода, который просто и легко проверяет статус Достижимости, используя AFNetworking. (Как ни странно, есть много дискуссий об импорте SystemConfiguration.framework, который кажется неинтересным). Поэтому, если мой пользователь хочет свести к минимуму их использование данных и загружать только с помощью Wi-Fi, как я могу проверить наличие Wi-Fi и загружать только, если Wi-Fi доступен?

Во-вторых, кажется, что AFNetworking хочет быть удобным интерфейсом. Но я мог бы использовать интерфейс для этого интерфейса, потому что там есть много вещей, которые нужно пробираться, чтобы добраться до нужного материала. Мне просто нужно получить доступ к URL-адресу, загрузить xml-файл (основанный на достижимости) и сделать с ним все. Я пропустил что-то, что делает это простой задачей?

Когда я это понимаю, я полностью строю интерфейс или пять, чтобы упростить реализацию (предполагая, что я не просто идиот). Заранее спасибо за любые ответы.

+0

'Reachability' не является частью AFNetworking, вам придется полагаться либо на его уведомление, либо на проверку статуса [вручную] (http://stackoverflow.com/a/4186536/792677). Это имеет смысл, поскольку вы, возможно, захотите проверить подключение до того, как пользователь даже сможет попробовать что-то попробовать, а сетевые операции могут использовать кеш или вернуть ошибку. –

+0

Но AFNetworking использует доступность и реализует что-то очень похожее на то, что реализует Reachability, чтобы проверить статус соединения. Мой вопрос в первую очередь заключался в том, как наиболее эффективно получить доступ к этим перечислимым переменным. – AMayes

ответ

44

Фактически вопреки тому, что A-Live said Достижимость Является частью AFNetworking. Он реализован в AFHTTPClient.hhere. Вам нужны правильные импорты в файле .pch, как описано here, чтобы использовать его.

Чтобы использовать его, вы, вероятно, захотите получить подкласс AFHTTPClient, чтобы использовать setReachabilityStatusChangeBlockhere. Вот простой пример без использования подкласса.

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://google.com"]]; 
[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
    if (status == AFNetworkReachabilityStatusNotReachable) { 
     // Not reachable 
    } else { 
     // Reachable 
    } 

    if (status == AFNetworkReachabilityStatusReachableViaWiFi) { 
     // On wifi 
    } 
}]; 

Если вам не нравится, как эта установка достижимости работает, то я бы рекомендовал Tony Million's fork достижимости Apple. Простой пример:

Reachability *reach = [Reachability reachabilityWithHostname:@"google.com"]; 
if ([reach isReachable]) { 
    // Reachable 
    if ([reach isReachableViaWiFi]) { 
     // On WiFi 
    } 
} else { 
    // Isn't reachable 

    [reach setReachableBlock:^(Reachability *reachblock) 
    { 
     // Now reachable 
    }]; 

    [reach setUnreachableBlock:^(Reachability*reach) 
    { 
     // Now unreachable 
    }]; 
} 
+0

Будет ли это продолжать отслеживать статус доступности, или это единовременная вещь? – AMayes

+0

Блоки продолжают отслеживать. Если вы хотели остановить их, вы могли бы установить блоки на нуль (или эквивалент). –

+0

Я использую блок доступа к сети, но он никогда не срабатывает, и [httpClient networkReachabilityStatus] всегда возвращает -1, какие-либо советы, как заставить его работать? – Pion

8

Просто обновление, новая версия AFNetworking имеет осуждается AFHTTPClient.

Вы можете использовать AFHTTPRequestOperationManager.h вместо

Что-то маленькое, взятое из самой GitHub страницы:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; //url can be google.com or something you want to reach 

NSOperationQueue *operationQueue = manager.operationQueue; 
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) 

{ 
    switch (status) 
    { 
     case AFNetworkReachabilityStatusReachableViaWWAN: 
     case AFNetworkReachabilityStatusReachableViaWiFi: 
     { 
      NSLog(@"SO REACHABLE"); 
      [operationQueue setSuspended:NO]; // or do whatever you want 
      break; 
     } 

     case AFNetworkReachabilityStatusNotReachable: 
     default: 
     { 
      NSLog(@"SO UNREACHABLE"); 
      [operationQueue setSuspended:YES]; 
      //not reachable,inform user perhaps 
      break; 
     } 
    } 
}]; 
[manager.reachabilityManager startMonitoring]; 
+1

Однако это не даст ** текущий статус **, если доступность не изменится. Чтобы проверить текущее состояние, '[AFNetworkReachabilityManager sharedManager] .reachable' нужно сделать вот так. – Hemang

+0

Использование '[manager.reachabilityManager isReachable]' для проверки текущего состояния работает для меня. –

20

С AFNetworking 2.0 и выше, можно проверить наличие свободных мест, как это,

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
    switch (status) { 
     case AFNetworkReachabilityStatusUnknown: 
     case AFNetworkReachabilityStatusReachableViaWWAN: 
     case AFNetworkReachabilityStatusReachableViaWiFi: 
      //available 
      break; 
     case AFNetworkReachabilityStatusNotReachable: 
      //not available 
      break; 
     default: 
      break; 
    } 

    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 

}]; 

//start monitoring 
[[AFNetworkReachabilityManager sharedManager] startMonitoring]; 

Для получения текущего статуса

[AFNetworkReachabilityManager sharedManager].reachable 
+0

Это правильный ответ для AFNetworking 2.0, хотя Im обнаружил, что блок не называется надежно – Fraser