使用 Alamofire 和 SwiftyJson 从函数返回值
Returning a value from a function with Alamofire and SwiftyJson
我有一个应用 return 是一个信息菜单(基本上是菜单、menu_headers 和项目)。我想要这样的东西:
EKMenu.getMenu(menu_id: Int)
那会 return 一个菜单,但我想我需要一个完成处理程序。
我目前有:
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)
}
}
但我实际上 return 怎么办?我 99% 确定它是某种类型的完成处理程序,但是,作为 Swift 和 Alamofire 的新手,我有点迷茫。我看过 I won't be able to return a value with Alamofire in Swift 但知道其中一些很快就会过时(即 Swift 1.1)
getMenu 函数的完成处理程序示例,假设 menu
是您想要的值 "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)
})
我有一个应用 return 是一个信息菜单(基本上是菜单、menu_headers 和项目)。我想要这样的东西:
EKMenu.getMenu(menu_id: Int)
那会 return 一个菜单,但我想我需要一个完成处理程序。
我目前有:
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)
}
}
但我实际上 return 怎么办?我 99% 确定它是某种类型的完成处理程序,但是,作为 Swift 和 Alamofire 的新手,我有点迷茫。我看过 I won't be able to return a value with Alamofire in Swift 但知道其中一些很快就会过时(即 Swift 1.1)
getMenu 函数的完成处理程序示例,假设 menu
是您想要的值 "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)
})