[英]AFNetworking and Swift - Save json response
我想在swift中發出一個GET請求來獲取一些Json數據。 我嘗試使用AFNetworking並且它有效,但我不知道如何返回我得到的Json。
我嘗試了return
但它是在GET之前制作的,所以我什么都沒得到......
func makeGet(place:String) -> String
{
var str:String = ""
let manager = AFHTTPRequestOperationManager()
manager.requestSerializer.setValue("608c6c08443c6d933576b90966b727358d0066b4", forHTTPHeaderField: "X-Auth-Token")
manager.GET("http://something.com/api/\(place)",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
str = "JSON: \(responseObject.description)"
println(str) //print the good thing
},
failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
str = "Error: \(error.localizedDescription)"
})
return str //return ""
}
你能幫助我嗎 ?
由於您希望在完成Web服務請求后返回值,您必須通過委托或塊傳遞數據(在swift中稱為閉包)
我看到這里有用的塊
//Above your class file create a handler alias
typealias SomeHandler = (String! , Bool!) -> Void
func makeGet(place:String , completionHandler: SomeHandler!)
{
var str:String = ""
let manager = AFHTTPRequestOperationManager()
manager.requestSerializer.setValue("608c6c08443c6d933576b90966b727358d0066b4", forHTTPHeaderField: "X-Auth-Token")
manager.GET("http://something.com/api/\(place)",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
str = "JSON: \(responseObject.description)"
println(str) //print the good thing
completionHandler(str,false) //str as response json, false as error value
},
failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
str = "Error: \(error.localizedDescription)"
completionHandler("Error",true)
})
//return str //return "" You don't want to return anything here
}
當你想調用方法時,獲取這樣的值
makeGet(){
yourJSONString , errorValue in //Here the value will be passed after you get the response
if !errorValue {
println("The End."
}
}
更多關於快速關閉
僅供參考:AFNetworking所有者為swift創建了一個新的網絡層,它被稱為Alamofire ( AFNetworking的 AF是Alamofire:])
您沒有從該函數獲得響應,因為GET操作是異步發生的。 也就是說,執行順序如下:
你打電話給makeGet
makeGet
創建manager
,它會觸發GET請求
makeGet
完成執行並返回一個空字符串
(一段時間之后) manager
從服務器接收一個值並執行success
或failure
塊。
因此,您可以訪問從服務器返回的JSON的唯一一次是在步驟4中,您需要找到一種存儲該值的方法,以便您可以解析它或使用它或其他任何東西。 這里有多種選擇 - 一種是定義在類實例上調用事件處理程序的閉包,如下所示:
class MyClass {
func jsonLoaded(json: String) {
println("JSON: \(json)")
}
func jsonFailed(error: NSError) {
println("Error: \(error.localizedDescription)")
}
func makeGet(place:String) {
let manager = AFHTTPRequestOperationManager()
manager.requestSerializer.setValue("608c6c08443c6d933576b90966b727358d0066b4", forHTTPHeaderField: "X-Auth-Token")
manager.GET("http://something.com/api/\(place)",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in
self.jsonLoaded(responseObject.description)
},
failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
self.jsonFailed(error)
}
)
}
}
let manager = AFHTTPSessionManager()
manager.GET("http://api.androidhive.info/json/movies.json", parameters: nil, success: { (operation, responseObject) -> Void in
print(responseObject)
}, failure: nil)
AFHTTPRequestOperationManager在最新的AFnetworking庫中不可用,它已替換為AFHTTPSessionManager。 這是獲取響應對象的簡單示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.