通过监听网络状态来进行对应的推送通知,让启动的页面再次请求一次网络,如果有安装 AFNetworking 的话,可以通过 AFNetworkReachabilityManager 来监听网络状态
WJNetworkHelper.h
typedef enum {
StatusUnknown = -1,//未知网络
StatusNotReachable = 0,//没有网络
StatusReachableViaWWAN = 1,//手机自带网络
StatusReachableViaWiFi = 2 //wifi
}WJNetworkStatus;
/** 网络状态的Block*/
typedef void(^WJNetworkStatusBlock)(WJNetworkStatus status);
@interface WJNetworkHelper : NSObject
/**
实时获取网络状态,通过Block回调实时获取(此方法可多次调用)
*/
+ (void)networkStatusWithBlock:(WJNetworkStatusBlock)networkStatus;
@end
WJNetworkHelper.m
+ (void)networkStatusWithBlock:(WJNetworkStatusBlock)networkStatus {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
networkStatus ? networkStatus(StatusUnknown) : nil;
break;
case AFNetworkReachabilityStatusNotReachable:
networkStatus ? networkStatus(StatusNotReachable) : nil;
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
networkStatus ? networkStatus(StatusReachableViaWWAN) : nil;
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
networkStatus ? networkStatus(StatusReachableViaWiFi) : nil;
break;
}
}];
});
}
具体代码
#pragma mark ————— 网络状态监听 —————
- (void)monitorNetworkStatus{
/*
*/
// 网络状态改变一次, networkStatusWithBlock就会响应一次
[WJNetworkHelper networkStatusWithBlock:^(WJNetworkStatus networkStatus) {
switch (networkStatus) {
// 未知网络
case StatusUnknown:
NSLog(@"网络环境:未知网络");
// 无网络
case StatusNotReachable:
NSLog(@"网络环境:无网络");
KPostNotification(KNotificationNetWorkStateChange, @NO);
break;
// 手机网络
case StatusReachableViaWWAN:
NSLog(@"网络环境:手机自带网络");
// 第一次安装App是需要请求一次网络,以后就不需要了,所以保存一个属性 isNoNetwork 进行判断是否需要请求网络,第一次为YES,需要请求网络,以后就不需要再次请求网络了为NO
if (SettingInfoTools.shareSettingInfoTools.isNoNetwork == YES) {
// 发送重新请求数据的通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshHomeData" object:nil];
}
KPostNotification(KNotificationNetWorkStateChange, @YES);
// 无线网络
case StatusReachableViaWiFi:
NSLog(@"网络环境:WiFi");
if (SettingInfoTools.shareSettingInfoTools.isNoNetwork == YES) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshHomeData" object:nil];
}
KPostNotification(KNotificationNetWorkStateChange, @YES);
break;
}
}];
}
// 这个接受通知的代码放到需要刷新的的VC里面,接受通知,然后进行刷新数据
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:@"refreshHomeData" object:nil];
// 有接受通知,肯定就有取消通知跟着
-(void)dealloc
{
// 随便一个删除通知的代码都可以
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"refreshHomeData" object:nil];
// [[NSNotificationCenter defaultCenter] removeObserver:self];
}
- 这段代码是重新请求一次数据的代码
-(void)refreshData
{
// 修改是否需要再次请求数据的属性,保存起来,这样以后再次启动App就不会出现请求2次的情况
SettingInfoTools.shareSettingInfoTools.isNoNetwork = NO;
// 保存不再请求数据的属性
[SettingInfoTools saveSettingInfoTools];
// 重新请求一次数据
[self loadData];
}