使用 Alamofire 和 SwiftyJson 从函数返回值

Posted

技术标签:

【中文标题】使用 Alamofire 和 SwiftyJson 从函数返回值【英文标题】:Returning a value from a function with Alamofire and 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 无论如何都会为您提供帮助)。 对我来说看起来很不一样 【参考方案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 函数使用完成处理程序,类函数、实例方法都没有关系。 谢谢,非常感谢!

以上是关于使用 Alamofire 和 SwiftyJson 从函数返回值的主要内容,如果未能解决你的问题,请参考以下文章

SwiftyJson 和 Alamofire 使用的解码结构

如何使用 Alamofire 和 SwiftyJSON 正确解析 JSON

如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?

无法使用“((Any))”类型的参数列表调用“JSON” - 使用 AlamoFire 和 SwiftyJSON

使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序

使用 SwiftyJSON(和 Alamofire)解析 JSON 值