【问题标题】:Returning a value from a function with Alamofire and SwiftyJson使用 Alamofire 和 SwiftyJson 从函数返回值
【发布时间】:2015-06-11 04:56:52
【问题描述】:

我有一个应用程序,它返回一个信息菜单(基本上是菜单、菜单标题和项目)。我想要这样的东西:

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 来说是新手,我有点迷茫。我见过I won't be able to return a value with Alamofire in Swift,但知道其中一些很快就会过时(即 Swift 1.1)

【问题讨论】:

  • 您可以使用您提供的链接中解释的完成处理程序技术,那里没有过时的东西(您只需为 Swift 2 调整一些细节,但 Xcode 无论如何都会为您提供帮助)。
  • 对我来说看起来很不一样

标签: swift alamofire swifty-json


【解决方案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)
})

【讨论】:

  • 谢谢!这真的很有帮助。一个快速的问题。 MenuManager 将真正实例化并返回一个菜单。我试图在 getMenu 中创建它,但也需要在 processMenuHeaders 中访问它——您对此有何建议。传统上,在非异步环境中,我会分配给 menu_headers 并返回结果,但在这里可能是不可能的。我可以为此类提供菜单菜单的实例变量吗?抱歉,这是我觉得很难理解的 Swift 的一部分。在加州,所以现在是凌晨 2 点,很快就要睡觉了。再次感谢
  • 更直接地回答您的评论:我已将这个MenuManager作为示例。你可以在任何你想要的情况下为你的getMenu 函数使用完成处理程序,类函数、实例方法都没有关系。
  • 谢谢,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
相关资源
最近更新 更多