0

我有一个在 AppDelegate 上调用 SyncEngine 的应用程序。这启动了从 parse.com 获取数据并将该数据解析为本地对象并将该信息存储在设备上的核心数据数据库中的过程。

然后,该应用程序会加载一个带有 2 个视图控制器的 tabbarcontroller:

1) 地图视图控制器 2) 表格视图控制器

地图视图控制器将核心数据数据加载到一个数组中,并使用它在地图上绘制位置。tablevc 获取相同的数据并将其放入单元格中。

我试图让应用程序检查互联网连接并根据数据是获取的还是本地的来加载数据。这是交易:

mapVC 中的 viewDidLoad 注册了数据何时完成加载(来自网络)的通知。一旦发生这种情况,它就会调用 loadResultsFromCoreData 方法来执行 CD 获取请求。因此,如果没有互联网连接,则永远不会收到该通知。

我的问题是,何时何地是检查互联网连接的最佳地点?到目前为止,我在 AppDelegate 中使用此代码,但当然,它为时过早,所以 BOOL 设置为 NO:

- (BOOL) connectedToNetwork
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];
    BOOL internet;
    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) {
        internet = NO;
    } else {
        internet = YES;
    }
    return internet;
}

-(BOOL) checkInternet
{
    //Make sure we have internet connectivity
    if([self connectedToNetwork] != YES) {
        UIAlertView *internetAlert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Internet Required" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
        [internetAlert show];
        return NO;
    } else {
        return YES;
    }
}

任何帮助:)

4

1 回答 1

1

我认为问题出在您的 connectedToNetwork 方法上。ReachabilityWithHost 需要时间来连接到创建后的指定站点,然后您立即开始轮询它。您可能应该做的是使用您创建的可达性对象注册状态更改通知。Apple 的 Reachability 示例中有一个示例,但要点是:

// Register to find out when reachability status changes
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(<Whatever method you want to respond to reachability changes>) name: kReachabilityChangedNotification object: nil];

// Create a reachability object to start monitoring
Reachability* reach = [[Reachability reachabilityWithHostName: @"www.google.com"] retain];

// Start broadcasting status changes from the reachability object
[reach startNotifier];
于 2013-03-02T03:04:59.753 回答