19

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

我的问题是多方面的。我用谷歌搜索直到我的手指麻木了,还没有找到一个像样的代码示例,可以使用AFNetworking. (奇怪的是,有很多关于 importing 的讨论SystemConfiguration.framework,这似乎很容易)。因此,如果我的用户想要最小化他们的数据使用量,并且只使用 wifi 下载,我如何检查 wifi,并且只有在 wifi 可用时才下载?

其次,它似乎AFNetworking想成为一个用户友好的前端。但我实际上可以在这个前端使用一个前端,因为那里有很多东西需要人们清除才能获得需要的东西。我只需要访问一个 url,下载一个 xml 文件(基于可达性),然后用它做一些事情。我是否遗漏了一些使这成为一项简单任务的东西?

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

4

3 回答 3

45

实际上与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
    }];
}
于 2013-02-23T17:04:06.310 回答
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];

获取当前状态

[AFNetworkReachabilityManager sharedManager].reachable
于 2014-09-29T13:00:21.397 回答
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];
于 2014-06-04T20:02:34.773 回答