使用 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