2015-01-05 2 views
3

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

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

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

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

Спасибо!

+0

Почему бы не использовать стандартный Alamofire 'response' блок в запросе на POST?Когда ваше приложение получит ответ, ваш блок «response» будет выполнен и может вызвать любую логику, которая вам нравится. –

+0

@JonathanHersh Я уже использую блок «response» для обработки отклика профиля, но задавался вопросом, был ли особый способ передать «закрытие» для обработки определенных экземпляров. Для этого экземпляра я получаю профиль в ответ на «дистанционное уведомление». В других случаях, когда я получаю профиль, его просто называют. –

+0

Извините, непонятно, о чем вы спрашиваете. Блок ответа ** является закрытием. –

ответ

4

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

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

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

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

+0

Кроме того, метод .responseJSON очень полезен. – boidkan

+0

, поскольку это асинхронный код, вы должны поймать, если Alamofire выбрасывает. Это так? Или у вас всегда будет доступ к response.result.error? – Cmag

1

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

Как я понимаю, проблема теперь, у вас есть код, который обновляет профиль на сервере и обрабатывает ответ сервера. Код вызывается в двух контекстах, один инициируется вручную запросом пользователя, другой инициируется 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.

Это, ИМХО, является лучшим подходом, чем объявлять глобальное приложение внутри вашего AppDelegate.

1

Здесь вы идете

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 
}