AFNetworking 2.0 设备离线时的队列请求 setReachabilityStatusChangeBlock 啥都不做
Posted
技术标签:
【中文标题】AFNetworking 2.0 设备离线时的队列请求 setReachabilityStatusChangeBlock 啥都不做【英文标题】:AFNetworking 2.0 queue request when device is offline with setReachabilityStatusChangeBlock does nothingAFNetworking 2.0 设备离线时的队列请求 setReachabilityStatusChangeBlock 什么都不做 【发布时间】:2014-02-21 15:38:32 【问题描述】:我一直在尝试提出一种解决方案,以便在设备离线时使用 AFNetworking 对 HTTP 请求进行排队,以便在设备重新在线时完成请求。据我了解,这是可以设置setReachabilityStatusChangeBlock:
参数的。
到目前为止,这是我所拥有的:
// ViewController.h
@interface XYZTicketViewController : UIViewController<NSURLConnectionDelegate> // This is from before I started using AFNetworking, I'm intending to change all the requests to use AFNetworking in the near future.
@end
// ViewController.m
(...)
#import <AFHTTPRequestOperationManager.h>
#import <AFNetworkReachabilityManager.h>
(...)
@interface XYZTicketViewController ()
- (void)viewDidLoad
(...)
NSURL *baseURL = [NSURL URLWithString:@"http://54.213.167.202"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
switch (status)
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[operationQueue setSuspended:NO];
NSLog(@"WIFI");
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[operationQueue setSuspended:YES];
NSLog(@"oflline, baby");
break;
];
NSDictionary *parameters = @@"action": @"login", @"user": @"mail.address@gmail.com", @"pass": @"howdoyouturnthison";
[manager GET:@"http://54.213.167.202/api.php" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"JSON: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
(...)
我找不到任何示例,但我读到 here 说这是可能的,但到目前为止,在线状态发生变化时会发生任何事情。
希望你能帮帮我
【问题讨论】:
【参考方案1】:在调用 setReachabilityStatusChangeBlock 之前,您需要调用 startMonitoring
[manager.reachabilityManager startMonitoring];
如果您使用的是 AFNetworking 2.0,我建议如下:
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
DLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
switch (status)
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[operationQueue setSuspended:NO];
NSLog(@"WIFI");
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[operationQueue setSuspended:YES];
NSLog(@"offline, baby");
break;
];
【讨论】:
逻辑上不应该先设置状态变化块再开始监控吗? 我实际上实现了上面的代码——见***.com/questions/29187488/afnetworking-offline-queue但是当设备再次上线时请求永远不会执行。 在我的情况下,在状态更改块之前/之后调用不会改变任何内容。【参考方案2】:您不存储manager
。因此,就像离开 viewDidLoad 时删除了任何局部变量一样。将其存储到属性或实例变量中。
【讨论】:
我这样做了,但仍然没有发生任何事情以上是关于AFNetworking 2.0 设备离线时的队列请求 setReachabilityStatusChangeBlock 啥都不做的主要内容,如果未能解决你的问题,请参考以下文章