Использование Reachability для проверки соединения перед запуском метода

Я хочу использовать Reachability для проверки подключения к Интернету в моем приложении.

Я нашел руководство, которое пошагово настроит это в приложении. В учебнике объясняется «Шаг 4» — менеджер доступности. В нем упоминается следующее:

Это полезно, если объекту требуется прямой доступ к экземпляру достижимости, которым управляет одноэлементный объект.

Что может быть примером этого? Какому объекту потребуется прямой доступ к экземпляру?

В моем приложении у меня есть несколько методов, для которых требуется подключение к Интернету. Я пытаюсь достичь одного из двух подходов:

  1. Показывать UIAlertView при потере подключения к Интернету с просьбой повторить попытку.

    Примечание. Это относится только к определенным контроллерам представлений, а не к приложению, поскольку мне не нужно полностью ограничивать доступ через него.

  2. ИЛИ - я хотел бы использовать метод проверки наличия интернет-соединения перед запуском фактического метода, требующего подключения.

Как я могу настроить это с помощью Reachability таким образом?


person StuartM    schedule 13.11.2013    source источник


Ответы (1)


В 4-м разделе есть пример обёртки для Reachability (но в этой реализации нет обработки kReachabilityChangedNotification). Итак, как вы должны его использовать? — Как вы можете видеть в интерфейсе MTReachabilityManager, есть 1 метод для получения singleton-экземпляра менеджера и 4 метода для работы с ним:

+ (BOOL)isReachable;
+ (BOOL)isUnreachable;
+ (BOOL)isReachableViaWWAN;
+ (BOOL)isReachableViaWiFi;

Для вашего второго подхода в методе, который хочет подключиться, вам нужно сделать что-то вроде:

if ([[MTReachabilityManager sharedManager] isReachable]) {
     //do internet
} else {
     //alert 'no internet' or something
}

Для первого подхода (потеря соединения при получении данных из сети) эта обертка вам не поможет (не реализовано прослушивание kReachabilityChangedNotification). Таким образом, вам нужно добавить код из раздела 3 (Шаг 3: Уведомления) этого руководства — добавить прослушиватель для kReachabilityChangedNotification где-нибудь перед вызовом сетевого кода:

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

и добавьте метод для обработки уведомлений (будет запущен, когда Интернет изменит свое состояние):

- (void)reachabilityDidChange:(NSNotification *)notification {
    Reachability *reachability = (Reachability *)[notification object];
    if ([reachability isReachable]) {
        NSLog(@"Reachable");
        //if before there was no internet - now you can do whatever user wants when there was no internet
    } else {
        NSLog(@"Unreachable");
        //alert retry
    }
}
person in.disee    schedule 13.11.2013
comment
Спасибо. В первом рассматриваемом примере. Если бы я хотел проверить подключение к Интернету только на определенных контроллерах представления, как бы я справился с этим. Итак, на конкретном контроллере представления я хотел бы показать предупреждение о том, что они не могут быть переданы до тех пор, пока не будет возвращено интернет-соединение, но не все ли контроллеры представления только один в качестве примера? - person StuartM; 13.11.2013
comment
Могу ли я добавить наблюдателя только к viewDidLoad контроллера представления, для контроллера представления, который я хотел бы контролировать? - person StuartM; 13.11.2013
comment
1) Да, вы должны проверить соединение ([[MTReachabilityManager sharedManager] isReachable]) непосредственно перед тем, как вы хотите что-то загрузить (оберните сетевой код с помощью «if»). - person in.disee; 13.11.2013
comment
2) Да) Вы можете добавить наблюдателя в контроллер, который хотите) viewDidLoad - хорошее место для него, единственное - не забудьте отписаться от наблюдения (dealloc или где-то еще) - person in.disee; 13.11.2013
comment
если вы хотите добавить наблюдателя для всех контроллеров - вы можете создать любую категорию для UIViewController или создать класс контроллера базового представления для всех ваших vc, которые нуждаются в работе сети. Также хорошей практикой является создание сетевого менеджера, который будет обрабатывать всю работу сети (а также доступность сети) — я рекомендую вам ознакомиться с указаниями AFNetworking, это действительно хорошо) - person in.disee; 13.11.2013
comment
В настоящее время я использую AFNetworking для загрузки интернет-ресурсов, да, это то, о чем вы говорите (с точки зрения сетевого менеджера)? - person StuartM; 13.11.2013
comment
Если вы используете AFNetworking 2.0, существует класс AFNetworkReachabilityManager, и все базовые сетевые классы имеют ссылку на него @property (только для чтения, неатомарное, сильное) AFNetworkReachabilityManager *reachabilityManager; github.com/AFNetworking/ - person in.disee; 14.11.2013
comment
Если вы используете 1.x в AFHTTPClient, есть @property (только для чтения, неатомарное, назначение) AFNetworkReachabilityStatus networkReachabilityStatus; вы можете просто использовать их - person in.disee; 14.11.2013
comment
в 1.x вы также можете использовать - (void)setReachabilityStatusChangeBlock:(void ( ^ ) ( AFNetworkReachabilityStatus status ))block и установить блокировку всего, что вы хотите (если интернет стал активным - начните что-то делать, иначе покажите предупреждение или что-то еще ) - person in.disee; 14.11.2013
comment
Я использую 1.2.1 для AFNetworking. Должен ли я обновить это до 2.0, это стабильный выпуск Cocopod для этого? Если я использую AFNetworkingReachabilityManager, мне не нужно будет включать модуль Reachability — могу ли я выполнить те же проверки, используя этот новый AFNetworkingReachabilityManager для соединения — не могли бы вы обновить свой вопрос, чтобы показать, как использовать этот другой подход с AFNM, пожалуйста? - person StuartM; 14.11.2013