【问题标题】:FlickrAPI trouble understandingFlickrAPI 麻烦理解
【发布时间】:2019-05-08 17:56:30
【问题描述】:

我必须制作一个应用程序,让用户在地图上放置图钉,然后根据图钉的位置从 Flickr 中提取图片。我的教授给了我们一个 FlickrAPI 文件供我们使用,但我无法理解它在做什么。

import Foundation

class FlickrAPI: NSObject {
static let sharedInstance = FlickrAPI()    // Create a Singleton for the class

var photos: Array<String> = []
var errorLevel = 0

// Flickr Constants
let BASE_URL = "https://api.flickr.com/services/rest/"
let METHOD_NAME = "flickr.photos.search"
let API_KEY = "<API Key Here>"

func fetchPhotosFromFlickrBasedOn(Latitude lat: Double, Longitude lng: Double, PageToFetch pageToFetch: Int, completion: @escaping (_ error: Int, _ pg: Int, _ pgs: Int) -> Void) {
    // Empty our Photos Array
    photos.removeAll(keepingCapacity: true)

    // Build Aurgument List
    let methodArguments = [
        "method": METHOD_NAME,
        "api_key": API_KEY,
        "lat": String(format: "%f", lat),
        "lon": String(format: "%f", lng),
        "accuracy": "15",       // Accuracy (Street Level)
        "radius": "1",          // Distance
        "radius_units": "km",   // in Kilometers,
        "safe_search": "1",     // Safe (G Rated),
        "content_type": "1",    // Photos Only
        "per_page": "100",      // Photos per Page
        "page": "\(pageToFetch)",
        "extras": "url_m",      // Return Photo URLs
        "format": "json",       // Request JSON data format
        "nojsoncallback": "1"   // No JSON Callback
    ]

    // Initialize Shared Session
    let session = URLSession.shared
    let url = URL(string: BASE_URL + escapeUrlParameters(methodArguments))!
    let request = URLRequest(url: url)
    var page = 0
    var pages = 0

    // Setup Session Handler
    let task = session.dataTask(with: request, completionHandler: {data, response, error in
        self.errorLevel = 0  // Initialize Error Level
        if error != nil {
            self.errorLevel = 1  //***** Network Error
        } else {
            // Okay to Parse JSON
            do {
                let parsedResult: AnyObject = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as AnyObject
                if let photosDictionary = parsedResult.value(forKey: "photos") as? NSDictionary {
                    if let photoArray = photosDictionary.value(forKey: "photo") as? [[String: AnyObject]] {
                        page = photosDictionary["page"] as! Int
                        pages = photosDictionary["pages"] as! Int
                        for photoDictionary in photoArray {
                            if let photoUrl = photoDictionary["url_m"] as? NSString {
                                let ext = photoUrl.pathExtension
                                let noExt = photoUrl.deletingPathExtension
                                let addThumbDesignation = (noExt + "_q_d") as NSString
                                let thumbUrl = addThumbDesignation.appendingPathExtension(ext)
                                self.photos.append(thumbUrl!)
                            } else {
                                NSLog("***** Could not obtain an Image URL at Index:%d for Owner:%@", self.photos.count, photoDictionary["owner"] as! String)
                            }
                        }
                    } else {
                        self.errorLevel = 4  //***** No "Photo" Array key present
                    }
                } else {
                    self.errorLevel = 3  //***** No "Photos" Dictionary key present
                }
            } catch {
                self.errorLevel = 2  //***** Parsing Error
            }
            completion(self.errorLevel, page, pages)
        }
    }) 
    task.resume()
}

// Escape URL Parameters
func escapeUrlParameters(_ parms: [String : String]) -> String {
    var urlParms = [String]()
    for (key, value) in parms {
        let escapedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
        urlParms += [key + "=" + "\(escapedValue!)"]
    }
    return urlParms.isEmpty ? "" : "?" + urlParms.joined(separator: "&")
}
}

在我的代码中我有这个功能:

@IBAction func addPin(_ gestureRecognizer: UILongPressGestureRecognizer) {
    var touchPoint = gestureRecognizer.location(in: Map)
    var newCoordinates = Map.convert(touchPoint, toCoordinateFrom: Map)
    let annotation = MKPointAnnotation()
    annotation.coordinate = newCoordinates
    Map.addAnnotation(annotation)

    flickr.fetchPhotosFromFlickrBasedOn(Latitude: annotation.coordinate.latitude, Longitude: annotation.coordinate.longitude, PageToFetch: 1, completion: {error,pg,pgs in
print("Error: \(error)")
print("Page: \(pg)")
print("Pages: \(pgs)")
})
    //flickr.escapeUrlParameters(<#T##parms: [String : String]##[String : String]#>)
}

我知道代码应该发送我应该用来在我的应用程序上显示图像结果的 json 信息,但就像我说的那样,我很难理解教授的代码。我的主要问题是在调用该函数后,它会跳过所有需要运行以提取照片的内容。我显然缺少我需要的东西,以便我的代码能够执行它需要的东西。

【问题讨论】:

  • 还不错...让我一起拍东西
  • 现在它一直向我抛出错误 3,说没有照片字典。伙计,我很困惑。
  • 我正在查看他的代码,它在某些地方看起来有点傻。 JSONSerialization 是一种解压 JSON 响应的简单方法……可编码要容易得多……我宁愿嚼玻璃也不愿像他那样做。哈哈
  • 你有这方面的 GitHub 存储库吗?
  • 我只想根据 gps 位置从 Flickr 中提取图片,然后导航到我将显示图片的新视图。

标签: swift flickr


【解决方案1】:

FlickrAPI 中的 radius 参数指定的半径对 Flickr 的 API 无效。它应该低于 50。如果这是你想走的路线,你必须尝试看看你能逃脱的最大值是多少。

我建议使用 Postman 来测试 URL,而不是在 Xcode 中摆弄调试 API 问题。在 Xcode 中进行调用之前,将面向 API 调用的便便放在一个组中。这样就容易多了。在这种情况下,只需在 URL 所在的位置放置一个断点,在调试器中键入 po url,将 URL 复制到 Postman 中,然后查看 Postman 中返回的内容。像 Flickr 这样的 API 非常擅长告诉你到底发生了什么。另外,不要害怕查看文档。它使生活变得更加轻松。此端点的文档位于 here

当您到达完成调用时,放置另一个断点并输入po photos。它会打印出一个字符串数组,这些字符串是照片的 URL。

如果您只是点击地图,您可能不需要 info.plist 中的位置管理器或使用说明。最后,不要在 GitHub 或 SO 之类的开放论坛中丢弃 API 密钥。

【讨论】:

  • 所以它应该可以在照片阵列被填充的地方工作,所以我需要做的就是将它们拉到图像视图或类似于显示的东西?
  • 是的。我会使用 CocoaPod 来做到这一点。有一个叫做Kingfisher 的东西很简单。检查 GitHub 以获取 repo。
  • @JasonHutchison 你的决赛发生了什么?
猜你喜欢
  • 2015-10-22
  • 2017-06-21
  • 2015-01-27
  • 2021-02-12
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2019-11-29
  • 2015-07-12
相关资源
最近更新 更多