2015-06-11 2 views
2

У меня есть приложение, которое возвращает меню информации (в основном меню, menu_headers и элементы). Я хотел бы иметь что-то вроде этого:возвращающ значение от функции с Alamofire и SwiftyJson

EKMenu.getMenu (menu_id: Int)

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

я в настоящее время:

class func getMenu(menu_id: Int){ 
//class func getMenu(menu_id: Int, completionHandler:(NSArray -> Void)){ 

    let url="https://www.domain.com/arc/v1/api/menus/\(menu_id)/mobile" 
    Alamofire.request(.GET, url).responseJSON() { 
    (_, _, data, _) in 
    println("within menu request") 
    var json=JSON(data!) 
    var menu=EKMenu() 
    menu.name=json["menu"]["name"].stringValue 
    for (key, subJson) in json["menu"]["menu_headers"]{ 
     EKMenu.processMenuHeaders(subJson) 
    } 
    // how would we return a value here ????? 
    } 
} 

    class func processMenuHeaders(menu_header: JSON){ 
    let mh_name=menu_header["name"].stringValue 
    println("mh_name: \(mh_name)") 
    for (key, subJson) in menu_header["menu_headers"]{ 
     EKMenu.processMenuHeaders(subJson) 
    } 
    } 

но как я на самом деле вернуть что-то здесь? Я на 99% уверен, что это какой-то тип обработчика завершения, но, будучи новым для Swift и Alamofire, я немного потерялся. Любая помощь в этом? Я видел I won't be able to return a value with Alamofire in Swift, но знаю, что некоторые это устаревают очень быстро (т.е. Swift 1,1)

ТНХ

+0

вы можете использовать метод обработчика завершения объяснил в ссылке вы даете, ничего устаревшего там (вы просто должны адаптировать некоторые детали для Swift 2, но в любом случае Xcode поможет вам). – Moritz

+1

выглядит очень по-другому для меня – timpone

ответ

4

Пример обработчика завершения для вашей функции getMenu, предполагая menu значение, которое вы хотите «вернуться»:

class MenuManager { 

    // the handler takes an EKMenu argument 
    class func getMenu(menu_id: Int, completionHandler: (menu: EKMenu) ->()) { 

     let url="https://www.domain.com/arc/v1/api/menus/\(menu_id)/mobile" 
     Alamofire.request(.GET, url).responseJSON() { 
      (_, _, data, _) in 
      println("within menu request") 
      var json=JSON(data!) 
      var menu=EKMenu() 
      menu.name=json["menu"]["name"].stringValue 
      for (key, subJson) in json["menu"]["menu_headers"]{ 
       EKMenu.processMenuHeaders(subJson) 
      } 

      // wrap the resulting EKMenu in the handler 
      completionHandler(menu) 

     } 
    } 

    class func processMenuHeaders(menu_header: JSON){ 
     let mh_name=menu_header["name"].stringValue 
     println("mh_name: \(mh_name)") 
     for (key, subJson) in menu_header["menu_headers"]{ 
      EKMenu.processMenuHeaders(subJson) 
     } 
    } 

} 

MenuManager.getMenu(42, completionHandler: { menu in 
    // here the handler gives you back the value 
    println(menu) 
}) 
+0

thx! это действительно полезно. Один быстрый вопрос. MenuManager действительно будет создавать и возвращать одно меню. Я попытался создать его в getMenu, но вам нужно получить доступ к нему также в processMenuHeaders - что бы вы предложили в качестве стратегии для этого. Традиционно, в не-async-среде я бы назначил menu_headers и возвратил результаты, но, вероятно, это невозможно. Могу ли я иметь переменную экземпляра меню меню для этого класса? Извините, это та часть Swift, которую я чувствую. В CA, так что 2 утра и скоро заснуть. Thx снова – timpone

+0

Чтобы ответить на ваш комментарий более конкретно: я сделал этот класс «MenuManager» * как пример *. Вы можете использовать обработчик завершения для своей функции 'getMenu' в любой ситуации, которая вам нужна, с функциями класса, методами экземпляра, это не имеет значения. – Moritz

+1

Thx, действительно ценю! – timpone

Смежные вопросы