FlickrAPI проблемы с пониманием - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно создать приложение, в котором пользователь помещает булавку на карту, а затем извлекает фотографии из 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, которую я должен использовать для отображения результатов изображения в моем приложении, но, как я уже сказал, мне трудно понять код моего профессора.Моя главная проблема - после вызова функции она пропускает все, что нужно для запуска фотографий.Я явно упускаю то, что мне нужно, чтобы мой код выполнял то, что ему нужно.

1 Ответ

0 голосов
/ 07 декабря 2018

Параметр radius, который вы указали в FlickrAPI, указывает радиус, недопустимый для API Flickr.Это должно быть что-то ниже 50. Вам придется поиграться, чтобы узнать, с каким максимумом вы можете сойти, если это тот путь, по которому вы хотите идти.

Я бы порекомендовал использовать Postman для тестированияURL, а не возиться с проблемами отладки API в XCode.Соберите свой API ориентированный на вызов poop в группе, прежде чем делать вызовы в Xcode.Так намного проще.В этом случае просто установите точку останова там, где находится URL-адрес, введите po url в отладчике, скопируйте URL-адрес в Почтальон и посмотрите, что получится в Почтальоне.API, такие как Flickr, довольно хорошо рассказывают вам, что выдумали.Кроме того, не бойтесь смотреть на документацию для вещей.Это делает жизнь намного проще.Документация для этой конечной точки находится здесь .

Когда вы доберетесь до вызова завершения, установите другую точку останова и введите po photos.Он распечатает массив строк, которые являются URL-адресами для фотографий.

Возможно, вам не нужен менеджер местоположения или описание использования в вашем info.plist, если вы просто нажимаете накарта.Наконец, не бросайте ключ API на открытом форуме, таком как GitHub или SO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...