Возврат значения из функции с помощью Alamofire и SwiftyJson

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

EKMenu.getMenu(menu_id: Int)

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

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

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

  let url="https://www.example.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, я немного растерялся. Я видел и не буду иметь возможность возвращать значение с помощью Alamofire в Swift, но знайте, что некоторые из них очень быстро устаревают (например, Swift 1.1)


person timpone    schedule 11.06.2015    source источник
comment
Вы можете использовать метод обработчика завершения, описанный в ссылке, которую вы даете, там нет ничего устаревшего (вам просто нужно адаптировать несколько деталей для Swift 2, но Xcode все равно вам поможет).   -  person Eric Aya    schedule 11.06.2015
comment
мне кажется совсем другим   -  person timpone    schedule 11.06.2015


Ответы (1)


Пример обработчика завершения для вашей функции 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)
})
person Eric Aya    schedule 11.06.2015
comment
спасибо! это действительно полезно. Один быстрый вопрос. MenuManager действительно будет создавать и возвращать одно меню. Я попытался создать его в getMenu, но мне нужно получить к нему доступ также в processMenuHeaders - что бы вы предложили в качестве стратегии для этого. Традиционно в неасинхронной среде я бы назначал menu_headers и возвращал результаты, но здесь, вероятно, это невозможно. Могу ли я иметь переменную экземпляра меню меню для этого класса? Извините, это та часть Swift, которую мне трудно понять. В Калифорнии 2 часа ночи и скоро спать. Спасибо еще раз - person timpone; 11.06.2015
comment
Чтобы ответить на ваш комментарий более прямо: я сделал этот класс MenuManager просто в качестве примера. Вы можете использовать обработчик завершения для вашей функции getMenu в любой ситуации, с функциями класса, методами экземпляра, это не имеет значения. - person Eric Aya; 11.06.2015
comment
Спасибо, очень ценю! - person timpone; 11.06.2015