Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > Адекватный контроль сетевого соединения


Автор: Selestin 1.4.2013, 00:54
Добрый день!

Подскажите, каким образом более правильно реализовать контроль сетевого соединения?

Приложение обменивается JSON пакетами с сервером, необходимо контролировать момент, когда сеть пропала.
Было решено внедрить таймер, который отсылал бы keepalive пакеты до сервера, и если накапливалось определенное количество пропавших пакетов, сигнализировал бы об этом клиенту, отсылая на первый экран.

Суть вопроса вот в чем:
Этот таймер необходимо инициализировать в каждом view или же повесить при старте приложения, и уже оттуда обращаться к view, чтобы перекинуть юзера на первый экран?

Спасибо!

Автор: Bitter 1.4.2013, 01:17
Selestin, с таймером затея явно глупая. 
Для контроля соединения вам нужен класс Reachability. Его нет в SDK, но он есть в документации Apple вот тут (там же можно скачать пример с самим классом): http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html
Чтобы подключить его к проекту - надо скопировать файлы .m и .h в проект и добавить SystemConfiguration framework

Автор: Selestin 1.4.2013, 01:27
Как он работает мне понятно, спасибо.

Но мне необходимо давать "таймаут", для возможного восстановления соединения.
Тоесть мне нужно будет засекать, через этот фрейморк, сколько времени сеть лежит, получается таймером уже, и по истечении времени выводить на главный экран?

Автор: Bitter 1.4.2013, 10:15
Написал сначала что таймаут не нужен, но топом подумал и решил, что все таки да, если в течение таймаута у вас есть возможность восстановления сети, то вы просто по получении сигнала об обрыве связи можете вызвать метод повторной проверки состояния через указанное время. И если и при повторной проверке соединение не появилось, то тогда делайте переход.

Что-то типа того

Код

- (void)checkNetworkStatus:(NSNotification *)notice{
    NetworkStatus internetStatus = [internetReach currentReachabilityStatus];
    switch (internetStatus){
        case NotReachable:{
            self.isAllowInternet = NO;
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, timeout * NSEC_PER_SEC);
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                if (!self.isAllowInternet) {
                    // переход в нужное место
                }
            });
            break;
        }
    ...
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)