簡體   English   中英

AFNetworking和Swift - 保存json響應

[英]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創建了一個新的網絡層,它被稱為AlamofireAFNetworking的 AF是Alamofire:])

您沒有從該函數獲得響應,因為GET操作是異步發生的。 也就是說,執行順序如下:

  1. 你打電話給makeGet

  2. makeGet創建manager ,它會觸發GET請求

  3. makeGet完成執行並返回一個空字符串

  4. (一段時間之后) manager從服務器接收一個值並執行successfailure塊。

因此,您可以訪問從服務器返回的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM