如何设置超时与AFNetworking-objective-c

 我来答
huanglenzhi
推荐于2016-03-27 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517190
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
1. 更改间隔几乎可以肯定不是你所描述的问题的最佳解决方案。相反,它似乎是你真正想要的是HTTP客户端来处理遥不可及,不是吗?AFHTTPClient已经有一个内置的,让你知道什么时候丢失连接,-setReachabilityStatusChangeBlock:。 请求可能需要很长的最好是到iOS知道如何处理连接速度慢,并告诉和无连接的所有的区别。 为了扩大我的推理,为什么其他在这个线程应该避免的,这里有几个想法: 他们甚至开始之前请求可以被取消。入队请求不保证它实际上启动时的担保。 间隔不应该取消长时间运行的请求,尤其是POST。试想一下,如果你试图下载或上传一个100MB的视频。如果请求被沿在最佳状态回事缓慢3,为什么你会不必要地阻止它,如果它采取多一点的时间比预期? 干performSelector:afterDelay:...可以在多线程应用程序。这将打开自己最多晦涩和难以调试的竞争条件。

2. 我强烈看上面mattt的答案-尽管这个答案并不属于一般的问题犯规,原海报的问题,检查可访问性是一个更好的选择 但是,如果你仍然想设置一个(没有所有固有的问题performSelector:afterDelay:等,然后拉入请求描述了一个办法做到这一点作为你只是做之一:NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:@"/" parameters:nil];
[request setTimeoutInterval:120];

AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:^{...} failure:^{...}];
[client enqueueHTTPRequestOperation:operation];

但看到警告@,它似乎苹果不容许这种POST请求被改变(这是固定的iOS 6及以上)。 正如@ChrisopherPickslay指出,这不是一个整体它是一个接收(或发送数据)之间。我不知道有什么方法可以理智地做一个全面的苹果说: 该时间间隔,以秒为单位。如果在连接期间尝试 要求保持空闲的时间超过间隔时间越长,要求 被认为具有出去。默认时间间隔为60 秒。

3. 终于找到了如何用POST请求做到这一点:- (void)timeout:(NSDictionary*)dict {
NDLog(@"timeout");
AFHTTPRequestOperation *operation = [dict objectForKey:@"operation"];
if (operation) {
[operation cancel];
}
[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
[self perform:[[dict objectForKey:@"selector"] pointerValue] on:[dict objectForKey:@"object"] with:nil];
}

- (void)perform:(SEL)selector on:(id)target with:(id)object {
if (target && [target respondsToSelector:selector]) {
[target performSelector:selector withObject:object];
}
}

- (void)doStuffAndNotifyObject:(id)object withSelector:(SEL)selector {
// AFHTTPRequestOperation asynchronous with selector
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
@"doStuff", @"task",
nil];

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]];

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:requestURL parameters:params];
[httpClient release];

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
operation, @"operation",
object, @"object",
[NSValue valueWithPointer:selector], @"selector",
nil];
[self performSelector:@selector(timeout:) withObject:dict afterDelay:timeout];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout:) object:dict];
[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
[self perform:selector on:object with:[operation responseString]];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NDLog(@"fail! \nerror: %@", [error localizedDescription]);
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout:) object:dict];
[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
[self perform:selector on:object with:nil];
}];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];
[queue addOperation:operation];
}

我通过让我的服务器测试此代码sleep(aFewSeconds)。 如果你需要做一个POST请求,不使用[queue waitUntilAllOperationsAreFinished];。该方法作为请求并等待您的选择传递函数被触发

4. 我认为你必须修补的手动在 我继承AFHTTPClient,改变了- (NSMutableURLRequest *)requestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters

方法通过添加[request setTimeoutInterval:10.0];

在AFHTTPClient.m线236。 当然,这将是一件好事,如果是可配置的,但据我看到,是不可能的

5. 基于别人的答案,并就相关项目问题@mattt的建议,这里是一个下拉式的匆匆,如果你继承AFHTTPClient:@implementation SomeAPIClient // subclass of AFHTTPClient

// ...

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters {
NSMutableURLRequest *request = [super requestWithMethod:method path:path parameters:parameters];
[request setTimeoutInterval:120];
return request;
}

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block {
NSMutableURLRequest *request = [super requestWithMethod:method path:path parameters:parameters];
[request setTimeoutInterval:120];
return request;
}

@end

测试工作在iOS 6。

6. 现在已有上该功能pull请求。请参阅

7. 我们不能这样做有一个是这样的: 在h文件{
NSInteger time;
AFJSONRequestOperation *operation;
}

在m文件-(void)AFNetworkingmethod{

time = 0;

NSTtimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(startTimer:) userInfo:nil repeats:YES];
[timer fire];

operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[self operationDidFinishLoading:JSON];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
[self operationDidFailWithError:error];
}];
[operation setJSONReadingOptions:NSJSONReadingMutableContainers];
[operation start];
}

-(void)startTimer:(NSTimer *)someTimer{
if (time == 15&&![operation isFinished]) {
time = 0;
[operation invalidate];
[operation cancel];
NSLog(@"Timeout");
return;
}
++time;
}

转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式