Повторите запрос NSURLSessionDataTask после повторной авторизации (AKA NSInvocation эквивалентно в Swift)

TL;DR версия: что является ближайшим эквивалентом NSInvocation или аналогичный способ упаковки вызова метода, включая аргументы, в Swift?

Фон: у меня есть ServerController объект, который используется через мое приложение, чтобы делать запросы к API. Волшебство происходит в этом методе:

    private func makeRequestWithPath(
            path: String,
            method: String = "GET",
            body: NSData? = nil,
            successBlock: (AnyObject?) -> Void) {  
// ...
            self.urlSession.dataTaskWithRequest(request,
               completionHandler: { (data, resp, error) -> Void in

                 if let httpResp = resp as? NSHTTPURLResponse {

                     switch httpResp.statusCode {

                         case 200:
                             successBlock(/* pass process response in here */)

                         case 401:
                             self.postNotificationOnMainThread(kAppTokenRefreshRequiredNotification)

// ...
            }.resume()

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

В этой части мне нужна помощь: мне нужно повторить исходный запрос API после повторной авторизации.

Ранее в Objective-C я мог бы использовать NSInvocation объект для упаковки исходного вызова метода, но он не доступен в Swift, и поэтому я думаю, что должен быть более похожий на Swift подход. Однако мне еще не удалось выяснить это.

Лучший подход, который я придумала до сих пор:

  • поставить аргументы вместе со ссылкой на ServerController в словарь и передать их в уведомление как object: параметр
  • в обозревателе уведомлений (после завершения повторной авторизации) вытащите аргументы из словаря и вручную повторно вызовите тот же метод, чтобы повторить запрос

Это кажется неоптимальным решением, и должен быть лучший путь.

0 ответов

Другие вопросы по тегам