直接从自定义 UITableViewCell 检查互联网连接
Check for internet connection directly from custom UITableViewCell
当用户试图在自定义 UITableViewCell
中更改 UISwitch
的状态时,我想通知用户如果没有活动的互联网连接则不允许这样做。我的问题是决定将互联网连接检查逻辑放在哪里。将它放在自定义单元格中最简单 class 但这是一个视图 class 并且坚持 MVC 设计模式这可能不是最好的方法。
我试图寻找问题的答案,但找不到任何可以帮助我做出决定的答案。
提前感谢您提出任何有用的建议。
我通常有一个 NetworkManager
具有所有这些逻辑。
#import "NetworkManager.h"
#import <Reachability.h>
@implementation NetworkManager
+ (void)performActionIfConnection:(void(^)())action andError:(void(^)())error{
if ([NetworkManager test]) {
if (action) {
action();
}
}else{
if (error) {
error();
}
}
}
+ (BOOL) test
{
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus remoteHostStatus = [reach currentReachabilityStatus];
return !(remoteHostStatus == NotReachable);
}
@end
您的手机不应该完全知道该过程。
一个潜在的架构是让视图控制器不断地了解互联网连接。这可以通过更新 VC 关于网络变化的网络 class 来实现。这样 VC 可以发出适当的警告 e.t.c。当用户点击开关时。
首先,您已从下方 link 下载 Reachability class。
然后在 AppDelegate.h 文件中导入 Reachability class。
#import Reachability.h
请在AppDelegate.h文件中写入以下代码。
@property(nonatomic)Reachability *internetReachability;
@property(nonatomic)BOOL isInternet;
请注意,APP_DELEGATE 是 AppDelegate 的一个实例,而 IS_INTERNET 是 isInternet 变量的一个实例,它在 AppDelegate.h 文件中声明。
#define APP_DELEGATE ((AppDelegate *)[[UIApplication sharedApplication] delegate])
#define IS_INTERNET APP_DELEGATE.isInternet
之后只需将以下代码复制并粘贴到您的 AppDelegate.m 文件中,然后在 didFinishLaunchingWithOptions 方法中调用 setupTheInternetConnection 方法.
-(void)setupTheInternetConnection {
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//Setup Internet Connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
self.internetReachability = [Reachability reachabilityForInternetConnection];
[self.internetReachability startNotifier];
[self updateInterfaceWithReachability:self.internetReachability];
}
- (void) reachabilityChanged:(NSNotification *)note {
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
[self updateInterfaceWithReachability:curReach];
}
- (void) updateInterfaceWithReachability: (Reachability*) curReach {
if(curReach == self.internetReachability) {
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus) {
case NotReachable: {
IS_INTERNET = FALSE;
break;
}
case ReachableViaWWAN: {
IS_INTERNET = TRUE;
break;
}
case ReachableViaWiFi: {
IS_INTERNET = TRUE;
break;
}
}
}
}
现在您可以使用 IS_INTERNET.
的值检查任何控制器中的互联网连接
希望对你有用。
当用户试图在自定义 UITableViewCell
中更改 UISwitch
的状态时,我想通知用户如果没有活动的互联网连接则不允许这样做。我的问题是决定将互联网连接检查逻辑放在哪里。将它放在自定义单元格中最简单 class 但这是一个视图 class 并且坚持 MVC 设计模式这可能不是最好的方法。
我试图寻找问题的答案,但找不到任何可以帮助我做出决定的答案。
提前感谢您提出任何有用的建议。
我通常有一个 NetworkManager
具有所有这些逻辑。
#import "NetworkManager.h"
#import <Reachability.h>
@implementation NetworkManager
+ (void)performActionIfConnection:(void(^)())action andError:(void(^)())error{
if ([NetworkManager test]) {
if (action) {
action();
}
}else{
if (error) {
error();
}
}
}
+ (BOOL) test
{
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus remoteHostStatus = [reach currentReachabilityStatus];
return !(remoteHostStatus == NotReachable);
}
@end
您的手机不应该完全知道该过程。
一个潜在的架构是让视图控制器不断地了解互联网连接。这可以通过更新 VC 关于网络变化的网络 class 来实现。这样 VC 可以发出适当的警告 e.t.c。当用户点击开关时。
首先,您已从下方 link 下载 Reachability class。
然后在 AppDelegate.h 文件中导入 Reachability class。
#import Reachability.h
请在AppDelegate.h文件中写入以下代码。
@property(nonatomic)Reachability *internetReachability;
@property(nonatomic)BOOL isInternet;
请注意,APP_DELEGATE 是 AppDelegate 的一个实例,而 IS_INTERNET 是 isInternet 变量的一个实例,它在 AppDelegate.h 文件中声明。
#define APP_DELEGATE ((AppDelegate *)[[UIApplication sharedApplication] delegate])
#define IS_INTERNET APP_DELEGATE.isInternet
之后只需将以下代码复制并粘贴到您的 AppDelegate.m 文件中,然后在 didFinishLaunchingWithOptions 方法中调用 setupTheInternetConnection 方法.
-(void)setupTheInternetConnection {
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//Setup Internet Connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
self.internetReachability = [Reachability reachabilityForInternetConnection];
[self.internetReachability startNotifier];
[self updateInterfaceWithReachability:self.internetReachability];
}
- (void) reachabilityChanged:(NSNotification *)note {
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
[self updateInterfaceWithReachability:curReach];
}
- (void) updateInterfaceWithReachability: (Reachability*) curReach {
if(curReach == self.internetReachability) {
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus) {
case NotReachable: {
IS_INTERNET = FALSE;
break;
}
case ReachableViaWWAN: {
IS_INTERNET = TRUE;
break;
}
case ReachableViaWiFi: {
IS_INTERNET = TRUE;
break;
}
}
}
}
现在您可以使用 IS_INTERNET.
的值检查任何控制器中的互联网连接希望对你有用。