Как получить обработчик / блок завершения после запроса Alamofire Post?

У меня есть метод, который обрабатывает Apple Push Notification Service удаленное уведомление. Когда этот метод выполняется, я хочу, чтобы он вызвал мой сервер и сделал HTTP POST запрос с использованием Alamofire библиотека. Я хочу выполнить другой метод, который будет обрабатывать ответ на запрос POST.

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

поскольку Alamofire запросы выполняются в фоновой очереди, как мне выполнить выполнение метода после получения профиля с сервера?

Что было бы хорошим вариантом для решения этой проблемы?

Спасибо!

3 ответа

Поскольку запросы Alamofire выполняются в фоновой очереди, как мне выполнить выполнение метода после получения профиля с сервера?

Обработка ответов встроена в Alamofire. Вы можете сделать что-то вроде этого (адаптировано из документов):

Alamofire.request(.POST, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .response { (request, response, data, error) in
                     println(request)
                     println(response)
                     println(error)
                   }

Обратите внимание .response вызов метода, который добавляет обработчик завершения к объекту запроса; обработчик завершения вызывается Alamofire, когда запрос завершается (или не выполняется).

Из формулировки вашего вопроса не было ясно, какую проблему вы пытались решить. Но вы уточнили свое намерение в комментариях к вопросу выше.

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

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

func updateProfile(parameters: [String:String], showAlert: Bool) {
    Alamofire.request(.POST, "http://myserver.com/profile", parameters: parameters)
             .response { (request, response, data, error) in
                         if (error == nil) {
                           processProfileResponse(response)
                           if showAlert {
                             showProfileWasUpdatedAlert()
                           }
                         }
                   }      

}

Обратите внимание showAlert параметр передан в updateProfile метод. Если вы проходите в trueназывает showProfileWasUpdatedAlert способ показать ваше предупреждение после получения ответа сервера. Обратите внимание, что это логическое значение "захватывается" замыканием, которое обрабатывает ответ Alamofire, потому что замыкание было определено внутри updateProfile функция.

Это, IMHO, лучший подход, чем объявление глобального приложения в вашем AppDelegate.

Ну вот

func AlamofireRequest(method: Alamofire.Method, URLString: URLStringConvertible, parameters: [String : AnyObject]?, encoding: ParameterEncoding, headers: [String : String]?) -> Alamofire.Result<String>? {
    var finishFlag = 0
    var AlamofireResult: Alamofire.Result<String>? = nil
    Alamofire.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers)
        .responseString { (_, _, result) -> Void in
            if result.isSuccess {
                finishFlag = 1
                AlamofireResult = result
            }
            else {
                finishFlag = -1
            }
    }
    while finishFlag == 0 {
        NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture())
    }
    return AlamofireResult
}
Другие вопросы по тегам