Проверка доступности AFNetworking
Я реализовал AFNetworking
без подкласса AFHTTPClient
, частично используя следующий код в DownloadQueueManager
:
-(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 до тех пор, пока мои пальцы не онемели и еще не нашли достойный образец кода, который просто и легко проверяет статус Reachability с помощью AFNetworking
. (Как ни странно, есть много дискуссий об импорте SystemConfiguration.framework
, который кажется неистовым). Итак, если мой пользователь хочет свести к минимуму их использование данных и загружать только с помощью wifi, как я могу проверить наличие Wi-Fi и загружать только, если Wi-Fi доступен?
Во-вторых, кажется, что AFNetworking
хочет быть удобным для пользователя интерфейсом. Но я мог бы использовать интерфейс для этого интерфейса, потому что там есть много вещей, которые нужно пробираться, чтобы добраться до нужного материала. Мне просто нужно получить доступ к URL-адресу, загрузить xml файл (основанный на достижимости) и сделать с ним все. Я пропустил что-то, что делает это простой задачей?
Когда я это понимаю, я полностью строю интерфейс или пять, чтобы упростить реализацию (предполагая, что я не просто идиот). Заранее благодарим за любые ответы.
Ответы
Ответ 1
На самом деле это противоречит тому, что A-Live сказал Досягаемость Является частью AFNetworking. Он реализован в AFHTTPClient.h
здесь. Для его использования вам нужен правильный импорт в файле .pch
, как обсуждалось здесь.
Чтобы использовать его, вы, вероятно, захотите иметь подкласс AFHTTPClient
, чтобы вы могли использовать setReachabilityStatusChangeBlock
, определенный здесь. Вот простой пример без использования подкласса.
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 о достижении 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
}];
}
Ответ 2
С 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
Ответ 3
Просто обновление, более новая версия 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];