7c9*_*fdf 36 iphone ios afnetworking
我试图通过使用AFNetworking 2.0和"AFNetworkReachabilityManager"来确定用户是否连接到互联网,但它似乎无法正常工作.即使互联网已关闭,也始终返回有效的互联网连接.这是我的代码:
-(BOOL)connected {
__block BOOL reachable;
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"No Internet Connection");
reachable = NO;
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
reachable = YES;
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
reachable = YES;
break;
default:
NSLog(@"Unkown network status");
reachable = NO;
break;
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
}];
return reachable;
}
Run Code Online (Sandbox Code Playgroud)
从我的viewDidLoad方法调用此方法.我的代码有问题吗,因为它不起作用?
bac*_*cup 102
你使这比它需要的更困难.试试这个:
- (void)viewDidLoad {
[super viewDidLoad];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
- (BOOL)connected {
return [AFNetworkReachabilityManager sharedManager].reachable;
}
Run Code Online (Sandbox Code Playgroud)
如果您还希望在状态更改时收到通知,请执行 setReachabilityStatusChangeBlock
希望这可以帮助!
Mar*_*bri 64
那是因为该块仅在可达性改变时执行.
要获取当前状态,您可以执行以下操作:
- (BOOL)connected {
return [AFNetworkReachabilityManager sharedManager].reachable;
}
Run Code Online (Sandbox Code Playgroud)
Ron*_*gge 11
您有两个代码错误会阻止您的代码工作.
首先,您对"开始监视"的调用发生在响应可达性更改而触发的块内 - 因此,块将永远不会触发(除非您在其他地方开始监视).
其次,无法保证该块何时触发.因此,您总是会看到'可达'返回它初始化的任何值 - 显然这通常是空的.即使您修复了第一个错误,也不能保证(并且实际上不太可能)在您返回之前块将会触发.
最后,在更一般的层面上,您还尝试以同步方式测试只能异步执行的代码.也就是说,可达性管理器不可能立即准确地确定可达性.它可以说"我认为我在WiFi上"或"我认为我在3G上",但它还需要检查它是否能够确定它是否能真正到达互联网(因此名称可达性).可达性不只是"我有无线网络"或"我有3g"连接,它还与您是否可以通过它连接互联网有关.这意味着设备实际上必须发送请求,虽然从技术上讲,这可以以同步方式完成,但本书中的每一条规则都要求网络代码必须异步完成,并且有充分的理由.如果您是同步的,则会阻止您的UI直到网络呼叫返回...可能是30分钟,40分钟,50分钟甚至60秒后,具体取决于相关的超时.
你应该做的是在应用程序中启动可达性单例监控,然后加载app委托的方法,然后再检索它的数据.在不知道应用程序结构的情况下,我甚至不会保证准确性,但这至少应该有所帮助.
小智 7
试试这个,
在AppDelegate中,didFinishLaunchingWithOptions方法
{ // SETUP AFNETWORKING's NETWORK INDICATOR AND REACHABILITY
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
Run Code Online (Sandbox Code Playgroud)
在HttpManager类中,
- (BOOL)isNetworkRechable {
if ([AFNetworkReachabilityManager sharedManager].reachable) {
if ([AFNetworkReachabilityManager sharedManager].isReachableViaWiFi)
NSLog(@"Network reachable via WWAN");
else
NSLog(@"Network reachable via Wifi");
return YES;
}
else {
NSLog(@"Network is not reachable");
return NO;
}
}
Run Code Online (Sandbox Code Playgroud)
在yourViewController中,
[[HttpManager sharedObject] isNetworkRechable];
Run Code Online (Sandbox Code Playgroud)
注意:请勿在最初检查networkRechability.因为它不会起作用.所以请等待至少1秒检查一下.
根据我的经验,
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
Run Code Online (Sandbox Code Playgroud)
花点时间执行setReachabilityStatusChangeBlock所以没有使用返回值-(BOOL)connected.
因此,一旦连接/断开网络,您就可以执行某些任务.
以下功能最好在现场检查连接(同步):
[AFNetworkReachabilityManager sharedManager].reachable;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38831 次 |
| 最近记录: |