AFNetworking 2 + SwiftyJSON

Posted

技术标签:

【中文标题】AFNetworking 2 + SwiftyJSON【英文标题】: 【发布时间】:2014-10-25 22:31:21 【问题描述】:

SwiftyJSON https://github.com/SwiftyJSON/SwiftyJSON 看起来很有前途。然而,这些说明只讨论了与Alamofire 的集成(AFNetworking for Swift)。但是,由于当前项目的性质,它已经在使用AFNetworking2,无法切换到Alamofire。但是,我在将 AFNetworkingSwiftyJSON 集成时遇到了问题。

我有以下代码块,如何将可以向下转换为NSDictionaryresponseObject 转换为SwiftyJSON 中定义的JSON 对象?下面的代码不起作用。

        let task:NSURLSessionDataTask = AFHTTPSessionManager.GET(
            url,
            parameters: params,
            success:  (task: NSURLSessionDataTask!, responseObject: AnyObject!) in

                dispatch_async(dispatch_get_main_queue(), 

                    // How do I convert responseObject, which can be downcasted to NSDictionary to a JSON object?
                    let data = JSON(data: responseObject)
                    completion(task: task, response: data as JSON!, error: nil)
                )
            ,
            failure:  (task: NSURLSessionDataTask!, error: NSError!) in
                dispatch_async(dispatch_get_main_queue(), 
                    completion(task: task, response: nil, error: error)
                )
            
        )

【问题讨论】:

感谢您提出这个问题。我以为我是唯一一个在 AFNetworking 和 SwiftyJSON 中遇到 JSON 解析问题的人 【参考方案1】:

首先,您不需要分派到主队列。 AFNetworking 已经在主线程上调用了这些块。

您使用的初始化程序需要数据,而不是 JSON 对象。

您当前正在使用此初始化程序,它需要 NSData:

let json = JSON(data: dataFromNetworking)

相反,你应该使用这个初始化器:

let json = JSON(jsonObject)

如果您在此处传递responseObject,SwiftyJSON 将可以正常工作。


另一个注意事项:此代码不属于完成块。在 AFNetworking 的设计中,您应该创建一个响应序列化程序来处理服务器的响应。我建议查看 AFJSONResponseSerializer 的源代码并将其移植到使用 SwiftyJSON。

【讨论】:

谢谢亚伦。我从successfailure 中删除了dispatch_async 块。我也推迟了致电JSON(object: jsonObject),这似乎有效。谢谢!

以上是关于AFNetworking 2 + SwiftyJSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

AFNetworking 2.0 对现有项目的更新

AFNetworking 2.2.1 中的错误

AFNetworking 2.0 JSON 解析

AfNetworking 2.0 发布问题

AFNetworking 2.0.0 后台下载