iOS - когда загружать внешние данные

В моем делегате приложения у меня есть это:

Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(reachabilityChanged:) 
                                             name:kReachabilityChangedNotification 
                                           object:nil];

[reach startNotifier];

HomeViewController_iPhone *homeViewController = [[HomeViewController_iPhone alloc] initWithNibName:@"HomeViewController_iPhone" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
UINavigationController *homeNavController = [[UINavigationController alloc] initWithRootViewController: homeViewController];
homeNavController.navigationBar.barStyle = UIBarStyleBlackTranslucent;

self.tabBarController.viewControllers = [NSArray arrayWithObjects:homeNavController, nil];

...

-(void)reachabilityChanged:(NSNotification*)note
{
Reachability * reach = [note object];

if([reach isReachable])
{
    NSLog(@"Notification Says Reachable");
    self.isConnected = YES;
}
else
{
    NSLog(@"Notification Says UN-Reachable");
    self.isConnected = NO;
}
}

Проблема в том, что в моем HomeViewController (viewDidLoad) я делаю так:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

if (appDelegate.isConnected)
{
    dispatch_async(kBgQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL: kFeedURL];
        [self performSelectorOnMainThread:@selector(fetchedData:) 
                               withObject:data waitUntilDone:YES];
    });
}

Но appDelegate.isConnected всегда НЕТ, даже когда у меня есть соединение. Я думаю, что проверка выполняется до того, как класс Reachability установит наличие соединения. Но где я могу позвонить, чтобы получить данные? Я пробовал viewDidLoad и viewWillAppear, но isConnected по-прежнему НЕТ в обеих этих точках.


person soleil    schedule 09.08.2012    source источник
comment
Кроме того, выборка работает, если я не использую оператор if (appDelegate.isConnected), но мне нужно выполнить эту проверку, потому что, если у пользователя нет подключения, вызов dispatch_async приведет к сбою приложения.   -  person soleil    schedule 10.08.2012
comment
Возможно, этот ответ поможет -› stackoverflow.com/questions/5195012/   -  person dnstevenson    schedule 10.08.2012


Ответы (1)


Решено, сделав это в делегате приложения перед созданием контроллеров представления, как в ответе, предложенном dnstevenson.

Reachability *reachability = [Reachability reachabilityForInternetConnection];    
NetworkStatus internetStatus = [reachability currentReachabilityStatus];
if (internetStatus != NotReachable) {
    //my web-dependent code
}
else {
    //there-is-no-connection warning
}
person soleil    schedule 11.08.2012