Повторите запрос 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:
параметр - в обозревателе уведомлений (после завершения повторной авторизации) вытащите аргументы из словаря и вручную повторно вызовите тот же метод, чтобы повторить запрос
Это кажется неоптимальным решением, и должен быть лучший путь.