Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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_Objective C_Afnetworking - Fatal编程技术网

Ios AFN网络和可达性:为什么请求在恢复后失败?

Ios AFN网络和可达性:为什么请求在恢复后失败?,ios,objective-c,afnetworking,Ios,Objective C,Afnetworking,我使用AFHTTPSessionManager向服务器发送请求,并使用可达性逻辑检查是否存在连接 请求的代码很简单: [manager POST:urlString parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { //Parse data... } failure:^(NSURLSessionDataTask *task, NSError *error)

我使用
AFHTTPSessionManager
向服务器发送请求,并使用可达性逻辑检查是否存在连接

请求的代码很简单:

   [manager POST:urlString parameters:parameters  success:^(NSURLSessionDataTask *task, id responseObject) {
       //Parse data...
   } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
   }];
此外,还有一些代码以类似GitHub中的示例的方式检查可用性:

NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            [operationQueue setSuspended:NO];
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            [operationQueue setSuspended:YES];
            break;
    }
}];

当状态更改(例如,
AFNetworkReachabilityStatusNotReachable
afnetworkreachabilitystatusreachableavia wifi
)并且请求恢复时,为什么执行故障块?原因是什么?我做错什么了吗?

我认为这可能是网络错误

事实:AFNetworking不会为您检查Internet,因此如果它返回故障,则会出现连接错误或其他逻辑错误(我想这不是第二种情况)

首先:你的可达性经理有什么测试?尝试访问哪个ip地址或域? 因为如果您的可达性状态返回wifi连接,它不会告诉您Web服务响应您

如果在遇到AFNetworking故障块时测试internet连接,则测试相关Web服务器的特定地址非常重要。
您还可以在Internet连接更改后立即进行多次尝试,因为您可以使用wifi网络,但尚未访问Internet(例如,在分配动态ip地址时)。

使用
AFNetworkReachabilityManager
时,我通常在
AppDelegate.m
中启动它。我不记得是否必须从那里开始,但我认为应该。如果您没有在那里启动,请尝试,如下所示:

- (void)applicationDidBecomeActive:(UIApplication *)application {

   [[AFNetworkReachabilityManager sharedManager] startMonitoring];

   // Rest of your code here
}
if ([AFNetworkReachabilityManager sharedManager].reachable) {
   NSOperationQueue *operationQueue = manager.operationQueue;
}
编辑:

还可以尝试:

NSOperationQueue * operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:manager.operationQueue];
[manager.operationQueue release]; // as i have read you must do this release, but not sure
// rest of your code here
您可能已经看过这篇文章,但如果没有,可能会有所帮助:

编辑2:

假设您试图模拟从排队开始就没有internet连接的情况,那么您的问题可能与此类似

从这个意义上讲,您可能应该在排队操作之前设置可达性检查,如下所示:

- (void)applicationDidBecomeActive:(UIApplication *)application {

   [[AFNetworkReachabilityManager sharedManager] startMonitoring];

   // Rest of your code here
}
if ([AFNetworkReachabilityManager sharedManager].reachable) {
   NSOperationQueue *operationQueue = manager.operationQueue;
}

让我知道它是否工作。

这是在设备上发生的,还是仅在模拟器上发生的?因为我在Xcode 5模拟器上遇到了可访问性问题,但它在设备上工作得很好(我的问题是当它必须从脱机模式切换到联机模式时,它会说它仍然脱机并抛出一些错误)

中的操作队列
AFURLSessionManager仅用于代理回调(请参阅页眉中的文档)

我怀疑请求是在脱机时执行的,但是回调被挂起,只有在
operationQueue
恢复时才会触发


但是,我还没有找到一种方法来恢复联机后的请求。

首先,感谢您的回答。我有一个类似于此的baseURL属性:
NSURL*rootURL=[NSURL URLWithString:@”http://example.com/"];
,和
AFHTTPSessionManager
使用此根URL初始化。根据文档,AFNetworking reachability manager会观察此主机中的更改。因此,如果状态更改(主机变为活动或WIFI打开),必须恢复操作队列,并且必须再次执行请求。您是否已在AppDelagate中启动AFNetworkReachabilityManager监视?否。它在初始化管理器时启动。在何处启动reachability manager是否有差异?当您注释
setReachabilityStatusChangeBlock时会发生什么情况e> ?请求执行,但由于队列未挂起,因此失败,代码为
nsurErrorCannotConnectToHost
。如果您在初始化
AFHTTPSessionManager
时使用的baseUrl不同于默认值,当您将其更改为类似“”的值时会发生什么?谢谢您的建议。我已经尝试了此操作。队列挂起,但在还原时会发生什么(
[操作队列设置暂停:否];
)每次执行失败块时。这意味着,由于某种原因,主机仍然无法访问。我可能遗漏了一些东西,但什么?你不能在Xcode5中使用release,但尝试了其他操作队列的方法,不起作用。是的,通常在使用ARC时不使用release。但在我传递链接的这篇文章中,它指出你应该,除了在设备上使用ARC.On外,我根本没有在Simulator中尝试过。哦,我忘记了这个问题:)我找到了一个解决方案,但这是一个可能只对我有效的特定情况。它的工作原理如下:如果请求因Internet连接而失败,我会添加它的特定属性(如类型、参数等)当网络再次可访问时,使用“AFNetworkingReachabilityDidChangeNotification”将使用此参数重新执行请求。HTH