AFNetworking检查可用性

时间:2013-02-23 14:33:29

标签: ios ios6 afnetworking reachability

我已经实施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];
}

我的问题很多。我用google搜索“我的手指麻木了,还没有找到一个合适的代码示例,可以使用AFNetworking简单轻松地检查可达性状态。 (奇怪的是,有很多关于导入SystemConfiguration.framework的讨论,这看起来很简单。因此,如果我的用户想要最小化他们的数据使用,并且只使用wifi下载,我该如何检查wifi,并且只有在wifi可用时才下载?

其次,似乎AFNetworking希望成为一个用户友好的前端。但我实际上可以在这个前端使用前端,因为那里有很多东西,人们不得不通过它来获得所需的东西。我只需要访问一个url,下载一个xml文件(基于可达性),并用它做一些事情。我错过了一些让这项任务变得简单的事情吗?

当我理解这一点时,我完全建立了一个前端或五个来简化实现(假设我不仅仅是一个白痴)。提前感谢任何回复。

3 个答案:

答案 0 :(得分:44)

实际上与A-Live said可达性是AFNetworking的一部分相反。它已在AFHTTPClient.h here中实施。您需要在.pch文件中按照here所述进行正确的导入才能使用它。

要使用它,您可能希望拥有AFHTTPClient的子类,以便使用setReachabilityStatusChangeBlock定义的here。这是一个不使用子类的简单示例。

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
    }
}];

如果您不喜欢此可访问性设置的工作原理,那么我建议使用Apple的可访问性Tony Million's fork。简单的例子:

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
    }];
}

答案 1 :(得分: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

答案 2 :(得分: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];