Лучший способ реализовать RKReachabilityObserver в RestKit - PullRequest
5 голосов
/ 06 января 2012

Я написал приложение на основе вкладок в Xcode / RestKit и пытаюсь использовать RKReachabilityObserver для определения интернет-соединения на устройстве.

В идеале я хотел бы иметь одну переменную достижимости во всем приложении (если это возможно), но в настоящее время моя реализация соответствует приведенному ниже коду и не очень хорошо работает при репликации на мои 4 вкладки.

Если у кого-нибудь есть какие-либо предложения относительно лучшего способа сделать это, я буду очень признателен за ваши комментарии.

view.h

@property (nonatomic, retain) RKReachabilityObserver *observer;

View.m

@interface AppViewController()
{
    RKReachabilityObserver *_observer;
}
@property (nonatomic) BOOL networkIsAvailable;
@synthesize observer = _observer;

-(id)initWithCoder:(NSCoder *)aDecoder {

    if ((self = [super initWithCoder:aDecoder])) {

        self.observer = [[RKReachabilityObserver alloc] initWithHost:@"mydomain"];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(reachabilityChanged:)
                                                     name:RKReachabilityDidChangeNotification
                                                   object:_observer];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // determine network availability
    if (! [_observer isReachabilityDetermined]) {
        _networkIsAvailable = YES;
    }
    else
    {
        _networkIsAvailable = NO;
    }

    _text.returnKeyType = UIReturnKeyDone;
    _text.delegate = self;
}

- (void)reachabilityChanged:(NSNotification *)notification {
    RKReachabilityObserver* observer = (RKReachabilityObserver *) [notification object];
    if ([observer isNetworkReachable]) {
        if ([observer isConnectionRequired]) {
            _networkIsAvailable = YES;
            NSLog(@"Reachable");
            return;
        }
    } 
    else 
    {
        _networkIsAvailable = NO;
        NSLog(@"Not reachable");
    }
}

тогда в любом месте, на мой взгляд, я просто делаю ....

if (_networkIsAvailable == YES)
    {...

Я реализовал это для нескольких представлений (что, кажется, вызывает проблему.

Каков рекомендуемый подход для приложения с несколькими представлениями?

Ответы [ 2 ]

18 голосов
/ 06 января 2012

Синглтон [RKClient sharedClient] уже имеет свойство для этого (reachabilityObserver).Не стесняйтесь использовать это.

if ([[[RKClient sharedClient] reachabilityObserver] isReachabilityDetermined] && [[RKClient sharedClient] isNetworkReachable]) {
    ....
}

Вы также можете подписаться на уведомления RKReachabilityObserver (если вы хотите предпринять какие-либо действия при изменении статуса достижимости)

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(reachabilityStatusChanged:) 
                                                 name:RKReachabilityDidChangeNotification object:nil];
2 голосов
/ 11 ноября 2014

Вот некоторые изменения в RestKit 0.20 и более поздних версиях.Код блока доступности должен выглядеть следующим образом:

    RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[RemoteTools serverUrl]];
[manager.HTTPClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    if (status == AFNetworkReachabilityStatusNotReachable) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No network connection"
                                                        message:@"You must be connected to the internet to use this app."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
}];
...