1

В нескольких интервью меня спрашивали об обработке соединений, вызовов веб-сервисов, ответах сервера и т. Д. Даже сейчас я не понимаю многих вещей. Не могли бы вы помочь мне получить лучшее представление о следующих сценариях?Как обрабатывать приложение, если соединение прерывается между вызовом веб-службы

  1. Что такое преимущество использования NSURLSessionDataTask вместо NSURLConnection -Есть идея, как потеря данных не произойдет, даже если разрывов соединения для NSURLSessionDataTask, но не для latter.But, как это работает?

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

  3. Данные, которые мы отправляем, были обновлены со стороны сервера. Но мы не получаем ответ от сервера. Что мы можем сделать на нашей стороне, чтобы справиться с этой ситуацией? - Увеличение времениOutInterval - единственное, что мы можем сделать?

Пожалуйста, помогите мне с этими сценариями. Заранее большое спасибо!!

+0

Аналогичная информация, может быть, помогает: http://stackoverflow.com/questions/28105504/what-is-the-biggest-difference-between-nsurlconnection-and-nsurlsession – shallowThought

+0

@shallowThought: Спасибо за ваш ответ. Где-то я читайте, как NSURLSession позволяет нам сохранять данные/или защищать приложение от потери данных, если сетевое соединение прерывается. Правильно ли это? Или Каковы вещи, которые мы должны рассмотреть, чтобы справиться с такой ситуацией, как разрывы сетевого соединения. – iOSManiac

ответ

1

Это несколько вопросов, действительно, но я постараюсь кратко ответить на них.

  1. Большинство обработки неудача же между NSURLConnection и NSURLSession. Основными преимуществами последних являются поддержка фоновых загрузок и аннулирование групп связанных запросов.

    Это означает, что если вы делаете большую загрузку, которая, по вашему мнению, может потерпеть неудачу, NSURLSession действительно предоставляет задачи загрузки, которые позволяют возобновить загрузку, если ваше сетевое подключение не работает, похожее на то, что NSURLDownload используется для OS X (никогда доступный на iOS). Это помогает только для загрузки больших файлов, но не для больших загрузок (которые требуют значительной поддержки на стороне сервера для возобновления) или других запросов.

  2. Ваша интуиция верна. Когда соединение выходит из строя, создайте объект достижимости, контролирующий это конкретное имя хоста, чтобы увидеть, когда будет подходящее время, чтобы повторить запрос. Затем повторите попытку.

    Вы также можете отобразить какой-то консультативный интерфейс, чтобы сказать, что у вас нет подключения к Интернету. (По рекомендации, я имею в виду то, что пользователю не нужно нажимать, и это не влияет на автономное использование приложения больше, чем необходимо, посмотрите на приложение Facebook для отличного примера.)

  3. Предоставить уникальный идентификатор, когда вы делаете запрос, и храните его на сервере вместе с ответом сервера, пока клиент не подтвердит получение ответа (или не очистит его в любом случае после некоторого разумного количества дней). Когда загрузка завершается, сервер дает вам ответ, если это возможно.

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

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

Надеюсь, что это поможет.

+0

: Большое спасибо за ваш ценный ответ :). Не могли бы вы подробнее рассказать о 2-м пункте. Как мы можем определить, успешна ли просьба или нет? Спасибо вам большое заблаговременно. – iOSManiac

+0

Успех обычно означает получение кода состояния HTTP из 200, а затем получение как можно большего количества байтов тела, как заголовок, который вы должны получить. Однако, предполагая, что вы захватываете что-то вроде JSON, вы также можете сделать это, увидев, что JSON правильно разбирается. Если это так, тогда вы получили все это. – dgatwood