2013-02-13 2 views
6

Как правило, в моих приложениях iOS, использующих довольно много HTTP-запросов для связи с сервером, я добавляю NSBlockOperation в глобальный NSOperationQueue приложения, а затем приостанавливаю и включить очередь, когда приложение обнаруживает изменение состояния интернет-соединения, тем самым сохраняя любые запросы, находящиеся в очереди, до тех пор, пока очередь не будет приостановлена. Тем не менее, я не совсем уверен, что таким образом любые выполняемые в данный момент операции будут остановлены, а затем снова добавлены в верхнюю часть очереди.Лучший способ справиться с изменением интернет-соединения с сетью HTTP

Мой вопрос: есть ли более эффективные способы борьбы с изменением состояния сети при работе с HTTP-запросов к т.е. удаленного сервера в паузы, возобновления, отмены запросов и т.д. ...

+0

Самым лёгким способом, который также наиболее часто используется и достаточен, чтобы игнорировать проблему. Создавайте запросы, отправляйте их на сервер, и если соединение не выполняется, отобразите ошибку пользователю. Больше ничего. Вы можете повторить попытку соединения, когда это не удается, но я бы не рекомендовал делать это более одного раза для запроса. – Sulthan

+0

@ Sulthan альтернативно, что, если запросы были внутренними, например. аналитика? –

ответ

2

Вы можете использовать класс Reachability, чтобы определить, когда изменяется статус сети, чтобы избежать отправки запросов. Это основано и обновлено с некоторого числа sample code provided by Apple. Это позволит вам узнать, когда интернет-соединение меняется без опроса.

Насколько я знаю, это лучший способ определить доступность сети. Вы получите мгновенное уведомление, когда сеть снова станет доступной. Я считаю, что он даже говорит вам, какая связь доступна (WiFi или сотовая связь).

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

0

Просто мои мысли - вы должны добавить отмену своих операций (вручную) like here. Когда вы обнаруживаете изменения статуса сети (нет соединения), вы можете отменить текущие операции, приостановить очередь, уведомить менеджера, чтобы он мог перенести операции. Когда сеть станет доступной, возобновите очередь.

+0

Вот что я делаю в данный момент. –

+0

Неясно, если вы добавили механизм отмены в свои операции. При приостановке очереди уже запущенные операции не влияют по умолчанию. –

+0

А, я вижу.Чтобы сделать его более ясным, выполняемые операции следует отслеживать и отменять при изменении подключения к Интернету, а затем снова добавлять в начало очереди, чтобы затем отправить его снова, когда есть доступное интернет-соединение? –

0

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

В другом случае вы снова начинаете транзакцию, заставляя ваш вызов ws, ws call терпеть неудачу, и по какой-либо причине вы не можете получить ответ, и вы откатите свою транзакцию и зарегистрируете/сообщите об этой ситуации. Вам просто нужно убедиться, что вы действительно не можете позволить себе пропустить ws-звонки.

0

Как предлагает Лука, Apple sample лучше всего справиться с этим. Но я также хотел бы рассмотреть вашу потребность в обнаружении изменений в сетевом соединении. Это обрабатывается путем наблюдения за уведомлением с именем kReachabilityChangedNotification.

Другими словами, ваш контроллер представления или код делегат должен иметь следующий фрагмент, чтобы обрабатывать сетевой достижимости (читать «связь») изменения:

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

И

//Called by Reachability whenever status changes.  
- (void) reachabilityChanged: (NSNotification*)note  
{  
     Reachability* curReach = [note object];   
     //TODO: Your specific handling. 
} 
Смежные вопросы