使用 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