我正在建立一个应用,只要互联网连接处于活动状态,就需要将离线数据与服务器同步。所以目前如果在将数据推送到服务器的过程中互联网连接丢失,它将被保存在数据库中,每当连接处于活动状态时,它就会将数据推送到服务器。我正在使用来自apple的新的可达性类版本:3.5。根据他们对特定视图控制器的示例,我可以这样做
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
self.internetReachability = [Reachability reachabilityForInternetConnection];
[self.internetReachability startNotifier];
[self updateInterfaceWithReachability:self.internetReachability];
}
/*!
* Called by Reachability whenever status changes.
*/
- (void) reachabilityChanged:(NSNotification *)note
{
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
[self updateInterfaceWithReachability:curReach];
}
- (void)updateInterfaceWithReachability:(Reachability *)reachability
{
if (reachability == self.internetReachability)
{
//Internet is active again- call api to push data to server
}
}
这适用于特定的视图控制器。在新的Reachability类中是否有任何其他方法可以检查整个应用程序运行?或者我是否必须在每个viewcontroller中检查以检查活动的Internet连接?
答案 0 :(得分:4)
您可以通过appdelegate进行检查。我之前做过这样的事。
@property (strong,nonatomic)Reachability *reach;
@property(nonatomic)NetworkStatus netStatus;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification object:nil];
reach = [Reachability reachabilityForInternetConnection];
[reach startNotifier];
[self checkNetworkStatus:nil];
}
- (void)checkNetworkStatus:(NSNotification *)notice
{
netStatus = [reach currentReachabilityStatus];
if (netStatus == NotReachable)
{
NSLog(@"The internet is down.");
// do stuff when network gone.
}
else
{
NSLog(@"The internet is working!");
// do stuff when internet comes active
[[NSNotificationCenter defaultCenter] postNotificationName:@"INTERNET_AVAILABLE" object:nil];
}
}
现在,当互联网出现时,它会通知。在您需要检查互联网连接的所有视图中添加观察者通知。它正在整个应用程序检查互联网。并且合成了属性。
========编辑
app appate.h中的
+ (BOOL)isActiveInternet;
并在app delegate.m
+ (BOOL)isActiveInternet
{
netStatus = [reach currentReachabilityStatus];
if (netStatus == NotReachable)
{
NSLog(@"The internet is down.");
// do stuff when network gone.
return FALSE;
}
else
{
NSLog(@"The internet is working!");
// do stuff when internet comes active
[[NSNotificationCenter defaultCenter] postNotificationName:@"INTERNET_AVAILABLE" object:nil];
return TRUE;
}
}
这样您就可以直接在项目中的任何位置调用此方法,例如
if([appdelegate isActiveInternet]) {
//yes net available do your stuff
}
答案 1 :(得分:0)
将数据推送到服务器在app委托中执行,而不是在特定的视图控制器中执行。这样你的aptibily代码将在Appdelegate中,你可以简单地从视图控制器调用Appdelegate的方法来保存数据或推送到服务器。
如果你不想;为了这个目的,我想使用Appdelegate使用单例类
答案 2 :(得分:0)
我与其他人合作的项目使用ReachabilityManager,它使用单例模式,如Reachability所述
你可以创建一个UIViewController的子类,它在viewdidload中添加通知观察,并且所有视图控制器都是这个viewcontroller的子类。
答案 3 :(得分:0)
一种方法是创建一个父 UIViewController类来处理可达性更改,父类将由其余的viewController类继承。
另一种方法是创建一个处理可达性的类,在应用程序启动时实例化,并通过通知或委托或阻止对可访问性感兴趣的viewControllers,通信和数据库处理程序进行通知。
您还可以通过将子视图直接添加到UIApplication的keyWindow来通知离线用户。