AFNetworking检查可用性

AMa*_*yes 19 reachability ios afnetworking ios6

我已经实现了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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Kei*_*ley 45

实际上与A-Live所说的相反,Reachability是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
    }
}];
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢这种可达性设置的工作方式,那么我会推荐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
    }];
}
Run Code Online (Sandbox Code Playgroud)


Hem*_*ang 20

使用AFNetworking2.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];
Run Code Online (Sandbox Code Playgroud)

获取当前状态

[AFNetworkReachabilityManager sharedManager].reachable
Run Code Online (Sandbox Code Playgroud)


Sha*_*ank 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];
Run Code Online (Sandbox Code Playgroud)