Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AFN网络脱机队列_Ios_Httprequest_Afnetworking - Fatal编程技术网

Ios AFN网络脱机队列

Ios AFN网络脱机队列,ios,httprequest,afnetworking,Ios,Httprequest,Afnetworking,目前,我正在使用AFHTTPRequestOperationManager将一个简单的脱机请求排队,但它似乎没有按预期的方式工作: 以下是负责代码,下面是不同的执行模式: @interface ViewController () { AFHTTPRequestOperationManager *manager; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad];

目前,我正在使用
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");
         }];
}
模式1:

  • 飞机模式下的设备
控制台输出:

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: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

模式2:

  • Wifi活动
控制台输出:

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: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
在模式1中,由于没有访问权限,请求导致失败块。但当设备联机时,请求不会再次执行。这里有我遗漏的东西吗?是否必须在操作队列或故障块中配置某些内容

参考文献:,

一些观察结果:

  • 在模式1中,由于可达性状态块异步运行,因此存在一点竞争条件,因此如果启动可达性并立即添加操作,状态可能尚未标识为脱机,因此队列可能尚未挂起,因此操作可能会立即启动(由于您处于脱机状态而失败)

    如果您在启动可达性之前和开始任何操作之前挂起队列,问题就会得到解决。如果您实际上处于脱机状态,队列将保持脱机状态,并且添加的任何操作也将被挂起。但是如果您确实处于联机状态,将合理地快速调用可达性块,并且队列将被promp它可以消除这种竞争条件

  • 队列的
    suspended
    状态不影响已启动的操作。In只影响尚未启动的操作。因此,如果在网络操作进行期间连接脱机,则没有内置机制来暂停操作,直到连接恢复,也不会重新启动操作当状态发生变化时进行操作。如果您想要该功能,您必须自己实现该功能


  • 还有几点意见:

  • 不过,值得注意的是,仅仅因为可访问性表示连接可用,并不保证请求会成功。您仍然需要优雅地处理失败的请求

  • 说到前一点,如果您想要更可靠的“我可以连接到特定的服务器吗?”您可以考虑使用<代码>管理器域>代码>而不是<代码> SydMasks/Cuff>。只需确保对生成的<代码> AFNETWorkReababyListMys//C>进行强引用,因为与SuntLon不同,它不能保持对自身的强引用。

  • <>代码> AFTHPREQUEQUEST操作管理器< /> >来自版本2 .x,您可以考虑升级到最新版本(以便使用<代码> AfHTTPSeService管理器< /代码>,<代码> NSURLSECTION/COD>实现。<代码> NSURLCONNECT/<代码> 2。x已被弃用。

    不幸的是,
    AFHTTPSessionManager
    不是基于
    NSOperation
    。但是如果您想享受“仅在建立连接时发送请求”功能,您可以将它们包装在异步
    NSOperation
    子类中(请参阅),您可以使用后台会话(请参阅,虽然是为AFNetworking 2.x编写的,但概述了使用
    AFHTTPSessionManager
    和后台会话的要点,后者仍然主要适用于版本3)


    哦,我明白了;这是我应该看到的。显然,
    isExecuting
    值应该是线索。因此,这个想法是:每当没有连接时,设备甚至都不会请求,只是简单地等待可访问性来显示WIFI/活动。非常酷!就第2点而言,我怎么能简单地执行以下操作ide特定操作的故障块:
    {[operationQueue setSuspended:YES];[operationQueue addOperation:operation.copy];[operationQueue setSuspended:NO];}
    这看起来像样吗?不,你不想让操作与队列的挂起状态混在一起。我不知道你为什么这样做。如果我们做一些简单化的事情,我可以在故障块中想象如下情况:
    如果([operationQueue isSuspended]){[operationQueue.addOperation:[operation copy]];}
    。这会把队列搞得一团糟(也就是说,本来应该排在队列顶端的东西现在已经到了末尾,所以你可能会玩弄优先级。而且,这将失去你可能拥有的任何依赖性。我认为你必须玩弄一下。坦白地说,你在这里也遇到了类似的竞争条件问题,那就是看队列的
    挂起状态可能不够好(如果您在请求中途失去连接,则在可达性报告问题之前,op可能会失败。您可能必须查看
    code
    NSError
    ,确定它是否被取消,并编写代码来处理该问题。谢谢,目前正在考虑是否可以以更高的速度处理这一切直截了当的方式。以更高的优先级将副本添加回队列。或者重写AFURLConnectionOperation,以便重试逻辑成为核心操作的一部分。但是创建新的请求管理器只会让事情变得更糟,IMHO。