直接从自定义 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。

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.

的值检查任何控制器中的互联网连接

希望对你有用。