【发布时间】: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 中提取图片,然后导航到我将显示图片的新视图。