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 啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

在 PWA 中离线时的图像存储

离线时在设备上测试 iOS 应用

AFNetworking 离线队列

在设备离线时响应本机应用程序发送推送通知

离线时无法建立与本地主机的连接

设备离线时,apns 丢弃了旧的推送通知