iOS - 增加AFHTTPRequestOperationManager的超时 [英] iOS - Increase timeout for AFHTTPRequestOperationManager

查看:150
本文介绍了iOS - 增加AFHTTPRequestOperationManager的超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从一个非常慢的服务器下载JSON数据。从服务器获取响应大约需要一分钟。我使用AFNetworking库和我的代码抛出请求超时错误:

  NSString * urlString = [NSString stringWithFormat:@ %@ / account.do?JSON&sysparm_action=getRecords\",baseUrlString]; 

NSString * login = [[NSUserDefaults standardUserDefaults] objectForKey:@login];
NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@password];

[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];


[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation * operation,id responseObject){
NSLog(@JSON:%@,responseObject);
[self parseJsonWithAccountsData:responseObject];
}失败:^(AFHTTPRequestOperation * operation,NSError * error){
NSLog(@Error:%@,operation.responseString);
[self performSelectorOnMainThread:@selector(failedWithContactsDownload)withObject:nil waitUntilDone:YES];
}];

未找到为 AFHTTPRequestOperationManager

解决方案

方法1。



我认为最好的方法是子类 AFHTTPRequestSerializer 并覆盖

 <$ (NSString *)方法
URLString:(NSString *)URLString
参数:(NSDictionary *)参数
- (NSMutableURLRequest *)requestWithMethod: / pre>

如下:

   - (NSMutableURLRequest *)requestWithMethod :(NSString *)方法
URLString:(NSString *)URLString
参数:(NSDictionary *)参数
{
NSMutableURLRequest * request = [super requestWithMethod:method URLString:URLString parameters :parameters];
[request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE];

返回请求;
}

,然后

  NSString * urlString = [NSString stringWithFormat:@%@ / account.do?JSON&sysparm_action=getRecords\",baseUrlString]; 

NSString * login = [[NSUserDefaults standardUserDefaults] objectForKey:@login];
NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@password];

[manager setRequestSerializer:YOUR_NEW_REQUEST_SERIALIZER_HERE];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];


[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation * operation,id responseObject){
NSLog(@JSON:%@,responseObject);
[self parseJsonWithAccountsData:responseObject];
}失败:^(AFHTTPRequestOperation * operation,NSError * error){
NSLog(@Error:%@,operation.responseString);
[self performSelectorOnMainThread:@selector(failedWithContactsDownload)withObject:nil waitUntilDone:YES];
}];

方法2

  NSString * urlString = [NSString stringWithFormat:@%@ / account.do?JSON&sysparm_action=getRecords\",baseUrlString]; 

NSString * login = [[NSUserDefaults standardUserDefaults] objectForKey:@login];
NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@password];

[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];

NSMutableURLRequest * request = [manager.requestSerializer requestWithMethod:@GETURLString:[[NSURL URLWithString:urlString relativeToURL:manager.baseURL] absoluteString] parameters:nil];
[request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE];

AFHTTPRequestOperation * operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation * operation,id responseObject){
NSLog(@JSON:%@,responseObject);
[self parseJsonWithAccountsData:responseObject];
}失败:^(AFHTTPRequestOperation * operation,NSError * error){
NSLog(@Error:%@,operation.responseString);
[self performSelectorOnMainThread:@selector(failedWithContactsDownload)withObject:nil waitUntilDone:YES];
}];
[manager.operationQueue addOperation:operation];


I'm downloading JSON data from a very slow server. It takes about a minute to get a resoonse from the server. I use AFNetworking library and my code throws "The request timed out" error:

NSString *urlString = [NSString stringWithFormat:@"%@/account.do?JSON&sysparm_action=getRecords",baseUrlString];

    NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"login"];
    NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];

    [manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];


    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        [self parseJsonWithAccountsData:responseObject];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", operation.responseString);
        [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES];
    }];

Didn't find a way to set a timeout for AFHTTPRequestOperationManager. How can I do it?

解决方案

Method 1.

I think the best way is to subclass AFHTTPRequestSerializer and override

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                 URLString:(NSString *)URLString
                                parameters:(NSDictionary *)parameters

like this:

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                 URLString:(NSString *)URLString
                                parameters:(NSDictionary *)parameters
{
    NSMutableURLRequest *request = [super requestWithMethod:method URLString:URLString parameters:parameters];
    [request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE];

    return request;
}

and then

    NSString *urlString = [NSString stringWithFormat:@"%@/account.do?JSON&sysparm_action=getRecords",baseUrlString];

    NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"login"];
    NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];

    [manager setRequestSerializer:YOUR_NEW_REQUEST_SERIALIZER_HERE];
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];


    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        [self parseJsonWithAccountsData:responseObject];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", operation.responseString);
        [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES];
    }];

Method 2

NSString *urlString = [NSString stringWithFormat:@"%@/account.do?JSON&sysparm_action=getRecords",baseUrlString];

NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"login"];
NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];

[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];

NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:urlString relativeToURL:manager.baseURL] absoluteString] parameters:nil];
[request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE];

AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
    [self parseJsonWithAccountsData:responseObject];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", operation.responseString);
    [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES];
}];
[manager.operationQueue addOperation:operation];

这篇关于iOS - 增加AFHTTPRequestOperationManager的超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆