Подтвердить что ты не робот

Проверка доступности 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 файл (основанный на достижимости) и сделать с ним все. Я пропустил что-то, что делает это простой задачей?

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

4b9b3361

Ответ 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];