- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前,我正在使用 AFHTTPRequestOperationManager
对一个简单的离线请求进行排队,但它似乎没有以预期的方式工作:
这是负责的代码,下面是不同的执行模式:
@interface ViewController ()
{
AFHTTPRequestOperationManager *manager;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
manager = [AFHTTPRequestOperationManager manager];
NSOperationQueue *operationQueue = manager.operationQueue;
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"Operation: %@", operationQueue.operations);
[operationQueue setSuspended:NO];
NSLog(@"ONLINE");
break;
case AFNetworkReachabilityStatusNotReachable:
default:
NSLog(@"Operation: %@", operationQueue.operations);
[operationQueue setSuspended:YES];
NSLog(@"OFFLINE");
break;
}
}];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"http://www.google.com"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id response){
NSLog(@"success");
}
failure:^(AFHTTPRequestOperation *operation, NSError *failure){
NSLog(@"failure");
}];
}
模式一:
控制台输出:
2015-03-21 16:03:54.486 OfflineSupport[928:227748] Reachability: Not Reachable
2015-03-21 16:03:54.494 OfflineSupport[928:227748] Operation: (
"<AFHTTPRequestOperation: 0x1701d0c20, state: isExecuting, cancelled: NO request: <NSMutableURLRequest: 0x170014ab0> { URL: http://www.google.com }, response: (null)>"
)
2015-03-21 16:03:54.494 OfflineSupport[928:227748] OFFLINE
2015-03-21 16:03:54.544 OfflineSupport[928:227748] failure
控制台输出续:
2015-03-21 16:04:05.594 OfflineSupport[928:227748] Reachability: Reachable via WiFi
2015-03-21 16:04:05.595 OfflineSupport[928:227748] Operation: (
)
2015-03-21 16:04:05.595 OfflineSupport[928:227748] ONLINE
模式二:
控制台输出:
2015-03-21 16:05:43.818 OfflineSupport[934:228478] Reachability: Reachable via WiFi
2015-03-21 16:05:43.826 OfflineSupport[934:228478] Operation: (
"<AFHTTPRequestOperation: 0x1701dde20, state: isExecuting, cancelled: NO request: <NSMutableURLRequest: 0x17001ad10> { URL: http://www.google.com }, response: (null)>"
)
2015-03-21 16:05:43.826 OfflineSupport[934:228478] ONLINE
2015-03-21 16:05:43.960 OfflineSupport[934:228478] success
控制台输出续:
2015-03-21 16:05:53.437 OfflineSupport[934:228478] Reachability: Not Reachable
2015-03-21 16:05:53.438 OfflineSupport[934:228478] Operation: (
)
2015-03-21 16:05:53.438 OfflineSupport[934:228478] OFFLINE
在模式 1 中,请求导致失败 block ,因为没有访问权限。但是当设备上线时,请求不会再次执行。我在这里缺少什么吗?我是否必须在操作队列或失败 block 中配置一些东西?
引用:AFNetworking 2.0 queue request when device is offline with setReachabilityStatusChangeBlock does nothing , IOS - best way to queue requests to be sent when connection is reestablished
最佳答案
一些观察:
在模式 1 中,您有一点竞争条件,因为可达性状态 block 异步运行,因此如果您启动可达性并立即添加操作,状态可能尚未被识别为离线,因此队列可能没有被挂起,因此操作可能会立即开始(并且因为您处于离线状态而失败)。
如果在开始可达性和开始任何操作之前挂起队列,问题就解决了。如果您实际上处于离线状态,队列将保持离线状态,并且添加的任何操作也将被暂停。但是如果你真的在线,reachability block 会被相当快地调用并且队列会被立即取消挂起。它消除了这种竞争条件。
队列的suspended
状态不会影响已经开始的操作。仅影响那些尚未开始的操作。因此,如果在进行网络操作时连接脱机,则没有内置机制来暂停操作直到连接恢复,也没有在状态更改时重新启动操作。如果您想要该功能,则必须自己实现。
更多观察:
但值得注意的是,仅仅因为可达性表示连接可用,并不能保证请求一定会成功。您仍然需要优雅地处理失败的请求。
对于前一点,如果您想要更可靠的“我可以连接到特定服务器”,您可以考虑使用 managerForDomain
而不是 sharedManager
。只需确保对生成的 AFNetworkReachabilityManager
保持强引用,因为与单例不同,它不会保持对自身的强引用。
AFHTTPRequestOperationManager
来自版本 2.x,您可以考虑升级到最新版本(这样您就可以使用 AFHTTPSessionManager
,一个 NSURLSession基于
的实现)。 2.x 中使用的 NSURLConnection
已被弃用。
不幸的是,AFHTTPSessionManager
不是基于NSOperation
的。但是如果你想享受“仅在建立连接时发送请求”的功能,你可以自己将它们包装在异步 NSOperation
子类中(参见 AFNetworking 3.0 AFHTTPSessionManager using NSOperation),你可以使用后台 session (请参阅 AFNetworking 2.0 and background transfers,虽然是为 AFNetworking 2.x 编写的,但概述了使用 AFHTTPSessionManager
和后台 session 的要点,这在很大程度上仍适用于版本 3)。
关于ios - AFNetworking 离线队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29187488/
有没有人设法通过 AFNetworking 使服务器发送事件 (SSE) 正常工作?我知道 AFURLConnectionOperation 有一个可以附加到的 inputStream 属性,但是 A
在我使用 AFNetworking 发出网络请求之前,有没有办法取消所有网络请求(由另一种方法启动的请求) 我试过如下但不起作用: - (void)sendRequest:(NSUInteger)pa
我同时有一些请求,我想处理直到全部完成。以下是要求: [self getProfileData]; [self checkNewSystemMessage]; [self checkChatMessa
我需要执行一系列按顺序运行的服务器调用,并且只有在所有先前的请求都成功时才能执行一个请求。 所以,我的想法是为每个请求创建一个 AFHTTPRequestOperation 并使用 [myAFHTTP
我正在尝试将 AFNetworking 添加到我的项目中,但我认为我的静态库之一正在使用此框架。我的问题是我该怎么做(将 AFNetworking 添加到我的项目中,最好是不使用 pods)以及我如何
我正在尝试上传一个 NSData,它是使用 AFNetwork 的图像,但出了点问题,我找不到我的错误所在 这是我的代码: NSData *imageData = UIImageJPEGReprese
使用AFNetworking 2.0的应用程序遇到以下问题。 使用AFHTTPRequestOperationManager的GET方法时,出现错误NSURLErrorDomain code -101
你能帮我理解如何使用 UIActivityIndicatorView+AFNetworking 或 UIProgressView+AFNetworking 吗?我是否需要再创建一个 UIViewC
我一直在寻找新的 AFNetworking 2.0 的示例来上传图像。 但是我碰壁了,无法弄清楚代码有什么问题。 所以这是我使用的代码 NSData *imageData = UIImageJPEGR
寻找如何使用 AFHTTPClient 发布 json 的示例.我看到有一个 postPath 方法需要一个 NSDictionary并且 AFJSONEncode 方法返回一个 NSData .是否
在我的项目中,我有 RestKit 和 IDMPhotoBrowser(使用 Cocoapods),所以两个版本 AFNetworking 之间存在冲突。您知道如何在同一个项目中同时使用它们吗? 最佳
我正在尝试为 UIButton 集成 AFNetworking 类(我正在调用配置文件页面并加载异步用户的头像)。 https://gist.github.com/dpettigrew/2925847
我正在尝试将一个项目从 AFNetworking 1.3 迁移到 AFNetworking 2.0。 在 AFNetworking 1.3 项目中,我有以下代码: - (void) downloadJ
我正在使用 AFNetworking 2.0 & 新版本。成功尝试了几个示例 WS 调用。我们已经实现了 Web 服务并被称为: 它的数据参数是加密后的字符串。 请求是:http://demo.XYZ
我正在尝试使用 AFHTTPClient 方法“postPath”将一个参数键的多个值传递给 HTTP 请求。但是,参数变量是 NSDictionary,因此我无法为我的关键“电子邮件”设置多个值。我
当我想停止使用 AFNetworking 构建的同步引擎中的所有当前请求时,我真的遇到了问题。 我有 5 个不同的 URL 可以查询。如果前一个查询被正确执行,则每个查询都会启动。 这非常有效。 我想
我正在制作一个应用程序,它将从网络服务中获取图片资源和文本。我选择了很棒的 AFNetworking 的 UIImageView+AFNetworking 类别来处理图像下载的东西。 但是,我面临着内
我在使用 AFNetworking 时遇到问题代码: #import "SyncProfile.h" #import "AFNetworking.h" @implementation SyncProf
我使用 AFNetworking 作为我的 iPhone 应用程序的网络层,该应用程序连接到使用 Devise 进行身份验证的 Rails 服务器。如果我登录(通过 POST 调用)提供用户名/密码,
iOS 版 AFNetworking 是否提供了缓存失败请求(例如由于没有互联网连接)并在互联网连接恢复时自动重试请求的解决方案。 谢谢,多林 最佳答案 请参阅Network Reachability
我是一名优秀的程序员,十分优秀!