Search code examples
swiftalamofireswifty-json

Returning a value from a function with Alamofire and SwiftyJson


I have an app that returns a menu of information (basically menus, menu_headers, and items). I'd like to have something like this:

EKMenu.getMenu(menu_id: Int)

that would return a menu but I think I would need a completion handler in here.

I currently have:

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)
    }
  }

but how do I actually return something here? I am 99% sure that it's some type of completion handler but, being new to Swift and Alamofire, I'm a bit lost. I've seen I won't be able to return a value with Alamofire in Swift but know that some of this is going out of date very quickly (ie Swift 1.1)


Solution

  • An example of a completion handler for your getMenu function, assuming menu is the value you want to "return":

    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)
    })