Как автоматически обрабатывать обновление токена с помощью RestKit

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

Вот что у меня получилось:

  • Базовые классы данных NSManagedObject, для каждого из них я добавил категорию REST, в которой есть функции для предоставления RKObjectMapping и RKRouteSet
  • настраиваемый подкласс RKObjectManager, который обрабатывает настройку заголовков, типов MIME, настройку заголовков авторизации и хранилищ основных данных
  • Подкласс RKObjectRequestOperation

Если у вас есть организационный совет, но мой главный вопрос заключается в том, как реализовать автоматическое обновление токена после получения кода состояния HTTP 401 и повторной отправки неудавшегося запроса с новым токеном?

Я начал с переопределения метода в моем подклассе RKObjectRequestOperation:

- (void)setCompletionBlockWithSuccess:(void ( ^ ) ( RKObjectRequestOperation *operation , RKMappingResult *mappingResult ))success failure:(void ( ^ ) ( RKObjectRequestOperation *operation , NSError *error ))failure

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


person Sasha_K    schedule 23.05.2014    source источник


Ответы (1)


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

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

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

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

person Wain    schedule 23.05.2014
comment
Привет, @Wain, приятно снова с вами поговорить, у нас был сеанс AirPair, если вы помните :) У меня проблемы с повторением запроса, в частности, блоки успеха и сбоя не срабатывают во второй раз, хотя вызов выполняется. Итак, вы предлагаете мне сохранить эти блоки как свойство диспетчера объектов и обработать все, что там есть? - person Sasha_K; 26.05.2014
comment
Я бы создал новый класс для хранения параметров и их экземпляра (или их списка, если во время повторной аутентификации поступает больше запросов). - person Wain; 26.05.2014