AFNetworking 和 Swift - 保存 json 响应

Posted

技术标签:

【中文标题】AFNetworking 和 Swift - 保存 json 响应【英文标题】:AFNetworking and Swift - Save json response 【发布时间】:2014-07-03 09:14:35 【问题描述】:

我想快速发出 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 ""

你能帮帮我吗?

【问题讨论】:

【参考方案1】:

由于您想在 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."
     

更多关于swift closures

仅供参考:AFNetworking 所有者为 swift 创建了一个新的网络层,称为 Alamofire(来自 AFNetworking 的 AF 是 Alamofire :])

【讨论】:

【参考方案2】:

您没有从该函数得到响应,因为 GET 操作是异步发生的。也就是执行顺序是这样的:

    你拨打makeGet

    makeGet 创建 manager,触发 GET 请求

    makeGet 执行完毕,返回一个空字符串

    (一段时间后)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)
            
        )
    


【讨论】:

【参考方案3】:
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。 这是一个获取响应对象的简单示例。

【讨论】:

以上是关于AFNetworking 和 Swift - 保存 json 响应的主要内容,如果未能解决你的问题,请参考以下文章

Swift 上的 AFNetworking

Swift:GM Xcode 6.1 和 AFNetworking AFJSONResponseSerializer

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

使用 AFNetworking 的 Swift 3

如何在 swift 中避免由于 AFNetworking 导致的内存泄漏

Swift 中的 AFNetworking 可达性管理器