使用 Swift 调用 Flickr API

Posted

技术标签:

【中文标题】使用 Swift 调用 Flickr API【英文标题】:Calling Flickr API with Swift 【发布时间】:2014-10-21 20:05:51 【问题描述】:

我试图从 Flickr API 获取一些 JSON 数据,但我的 Swift 代码不起作用。 这是基于Jameson Quave's tutorial 使用 Swift 发出 API 请求

func GetFlickrData(tags: String) 

    let baseURL = "https://api.flickr.com/services/rest/?&method=flickr.photos.search"
    let apiString = "&api_key=\(apiKey)"
    let searchString = "&tags=\(tags)"

    let requestURL = NSURL(string: baseURL + apiString + searchString)   
    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(requestURL, completionHandler:  data, response, error -> Void in

        var result = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary

        dispatch_async(dispatch_get_main_queue(), 
            println(result)
        )
    )

    task.resume()

这向我显示了 requestURL 参数 的错误:“NSURL 类型的值?未解包”。当我添加“!”时,错误消失了。但是,我在拨打电话时仍然遇到运行时错误。 在调试器中,我看到:

数据 = (NSData!)16642 字节 致命错误:在展开可选值时意外发现 nil

我错过了什么?

编辑 - 这在 Xcode 6 上运行良好,但在将 Xcode 更新到版本 6.1 时出现故障

【问题讨论】:

【参考方案1】:

结果变量实际上是 NSDictionary 类型的?如果它为 nil 并且您尝试访问它,则会引发运行时错误。 JSONObjectWithData 函数返回一个可选项,您可以在它的声明中看到:

class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions, error: NSErrorPointer) -> AnyObject?

您必须将结果转换为 NSDictionary 类型的对象吗?而不是 NSDictionary 以使其正常工作

let result = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary?
if let unwrappedResult = result 
    println(unwrappedResult)

SWIFT 2 更新:

JSONObjectWithData 不再返回 Optional,而是使用新的错误处理并标记为 throwing。签名现在看起来像这样:

public class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject

为了达到同样的效果,现在必须将调用包装在 do/catch 块中,或者使用 try?而不是尝试:

do 
    let result = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary
    print(result)
 catch 
    print(error)

【讨论】:

好的,修复了运行时错误。但是, unwrappedResult 正在打印零。当我在浏览器中使用相同的 URL 时,它为我提供了我需要的 JSON 数据.....但看起来 JSONObjectWithData 方法返回了一个 nil。有什么建议吗? 您必须以您希望响应的格式告诉 API。这可以通过发送值为“json”的“format”参数来完成。我遇到了一些问题,因为即使这样 API 也会使用 JSONP 进行响应,但我在这里找到了解决方案 http://***.com/questions/15930932/how-do-i-parse-this-flickr-response。 &nojsoncallback=1 是关键!

以上是关于使用 Swift 调用 Flickr API的主要内容,如果未能解决你的问题,请参考以下文章

添加 Flickr API 参数时的 oAuth “无效签名”

json Firebase - REST api调用 - 邮递员集合。 - Firebase架构 - https://www.flickr.com/gp/palaniraja-mca/32J3

引导图像库,无法加载自己的 Flickr 图像

使用 Alamofire 在 Swift 中调用 API?

如何在 API 调用中设置完成处理程序 - Swift 5

调用 API 数据 Swift/SwiftUI