可达性和通知中心

3
我需要我的应用程序不断监听 reachability 更改,并根据 network status 更新视图,我考虑使用 notificationcenter,并让所有视图都监听更改,但我不知道如何实现。
我知道如何使用 notificationcenterReachability,但似乎找不到实现 Reachability check 的地方。
我应该在哪里检查网络更改并通知其他 ViewControllers
我认为 AppDelegate 不是正确的位置,如果我把 Reachability 检查放在 ViewController 中,只有在 ViewController 处于“活动”状态时才进行网络检查。
2个回答

1
创建一个“单例”Reachability并在应用程序启动时进行初始化。
让单例定期检查可达性,例如使用NSTimer。然后它可以通知任何已注册到NSNotificationCenter的其他活动视图。
// AppDelegate.m: 

@property (nonatomic, strong) Reachability *reachability;

// in applicationDidFinishLaunching...
self.reachability = [[Reachability alloc] init]; 

并且

// Reachability.m

-(id)init {
   self = [super init];
   if (self) {
     [self setupTheTimer];
   }
   return self;
}

0
我会创建一个单例NSObject类来处理所有的网络检查。
命名为NetworkChecker。
为回调创建一个代理,比如NetworkCheckerDelegate,其中包含一个方法:
@protocol NetworkCheckerDelegate <NSObject>

-(void)networkStatusUpdated:(NSInteger)networkStatus;

@end

@interface NetworkChecker : NSObject
{
    id<NetworkCheckerDelegate> networkDelegate;
}

添加一个方法以启动网络检查并添加委托,如下所示:
+(void)updateNetworkWithDelegate:(id<NetworkCheckerDelegate>)delegate
{
    networkDelegate = delegate;

    //Set timer to do Reachability checks
}

-(void)timerIsCompleted
{
    //Do Reachability check

    if( newNetworkState != oldNetworkState ){
        [networkDelegate networkStatusUpdated:newNetworkState];
    }
}

然后在每个需要它的ViewController中,您可以这样做(在viewDidLoad中执行):
[NetworkChecker updateNetworkWithDelegate:self];

在网络状态改变后,实现以下操作:

-(void)networkStatusUpdated:(NSInteger)networkStatus

好的,那么我只有在调用 [NetworkChecker updateNetworkWithDelegate:self] 时才会进行检查,是吗?我需要持续的网络检查和通知。 - user1359448
不,那只是为了启用当前视图的网络检查器。您可以随时从NetworkChecker中调用networkStatusUpdated:以使用新的网络状态更新当前视图。 - Roland Keesom
你能否详细解释一下,最好再提供一些代码吗?我还没有完全理解。 :) - user1359448
有什么不清楚的吗?是创建单例模式?代理模式?还是视图控制器和网络检查器之间的连接? - Roland Keesom
我已经创建了类NetworkCheck:NSObject,但我不知道如何创建单例或代理,并且不知道如何在方法中使用Reachability代码。 - user1359448
我已经更新了我的答案并添加了一些代码。只要不实例化它,它就是一个单例。如果可以,请告诉我它是否有效。 - Roland Keesom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接