Обновление приложения iOS или предварительная проверка соединения - PullRequest
0 голосов
/ 11 октября 2011

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

У меня есть приложение для iOS, для которого требуется подключение к Интернету из-за широкогодиапазон данных, которые пользователь может запросить.В приложении есть пара контроллеров панели вкладок, в которых есть навигационные контроллеры, которые проводят пользователей через различные представления на основе иерархии и возвращаемых данных.Все запросы выполняются асинхронно с использованием ASIHTTPRequest с использованием наблюдателей NSNotificationCenter, которые ожидают, когда центральный класс запросов API выполнит запрос или сообщит об ошибке.В большинстве случаев пользователь загружает по крайней мере первые запросы, но я всегда могу попросить их включить свое соединение в UIAlertView, а затем вернуть их на этот более низкий уровень, вытолкнув другие уровни контроллера Nav из стека, если они этого не делают.связано.В целом приложение прекрасно работает.

Однако, если пользователь должен был сначала открыть приложение с отключенным соединением, у меня возникают проблемы.Часто мои начальные подпредставления (которые являются IBoutlets для простоты создания панели вкладок / иерархии навигации) будут пытаться загрузить, прежде чем я смогу проверить наличие соединения.Я не уверен, что, возможно, правильный способ сделать это - создать тайм-аут в моем делегате приложения до того, как что-то загрузится, или сделать первоначальный тестовый запрос, который фактически не извлекает какие-либо важные данные (так как кажется, что это почти невозможноили, по крайней мере, нецелесообразно полностью повторно инициализировать представление с нуля, не будучи его делегатом).

Есть ли у кого-нибудь простой метод, который они используют для достижения этой цели на этапе инициализации приложения?Я чувствую, что, должно быть, я упускаю что-то очевидное, поскольку остальная часть этого была настолько простой.

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

Я очень ценю любой вклад в это.

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Как вы предполагаете, это звучит как проблема архитектуры.

Я думаю, что решение по тайм-ауту в лучшем случае сомнительно, потому что весь процесс загрузки является недетерминированным.Я не знаю, какие представления вы заполняете данными, которые вы загружаете асинхронно;но скажем, это UITableView ради обсуждения.Когда представление впервые загружается, данных не будет;но если соединение доступно, вы будете асинхронно заполнять таблицу с помощью ASIHTTPRequest обратных вызовов.

Пример:

[[CCFConnectionManager sharedManager] countScenariosForScenarioID:lwScenario.uniqueID
                                                                groupCode:groupCode
                                                        completionHandler:^(NSInteger count) {
                                                            lwScenario.completionCount = count;
                                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                                [[self tableView] reloadData];
                                                            });

Поэтому в обработчике завершения я обновляю модель и отправляю1010 *.Последний на основной ветке.НТН.

0 голосов
/ 12 октября 2011
-(BOOL)isConnected{
BOOL connected;
const char *host = "www.google.com";
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
SCNetworkReachabilityFlags flags;
connected = SCNetworkReachabilityGetFlags(reachability, &flags);
BOOL isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
CFRelease(reachability);
return isConnected;}

этот метод добавить в приложение делегат.

0 голосов
/ 12 октября 2011

Я закончил тем, что использовал для этого больше уведомлений:

Я вызываю свой класс запросов API от моего делегата приложения с "тестовым запросом", а затем прослушиваю его также в делегате приложения.Если делегат приложения наблюдает успешный ответ, он запускает другой запрос, для которого мой активный контроллер представления является наблюдателем.Переданный объект содержит данные, которые необходимо получить принимающему контроллеру для перезагрузки своего представления.

Я думаю, что в следующий раз мне нужно будет спланировать свою делегацию немного лучше, чтобы избавиться от некоторых уведомлений.Однако в таком приложении, где один и тот же класс используется динамически и может принимать несколько наборов данных или когда данные могут быть предназначены для другого контекста, я полагаю, что уведомления имеют некоторый смысл.

...