Итак, я работал над этим уроком Гари Токманом , чтобы создать приложение для просмотра в ресторане, и это здорово. С начала и до конца все работает правильно и хорошо.
Цель состоит в том, чтобы изменить или добавить параметры и включить либо «термин», либо «категории». Тогда это теперь изменит поиск на конкретную c компанию, а не только рестораны.
Вот где я застрял, и мне не удается найти правильный синтаксис для выполнения этого параметра.
Это документ Business Endpoint: https://www.yelp.com/developers/documentation/v3/business_search
Это код для файла swift
Файл сетевой службы
import Foundation
import Moya
enum YelpService {
enum BusinessesProvider: TargetType {
case search(lat: Double, long: Double)
case details(id: String)
var baseURL: URL {
return URL(string: "https://api.yelp.com/v3/businesses")!
}
var path: String {
switch self {
case .search:
return "/search"
case let .details(id):
return "/\(id)"
}
}
var method: Moya.Method {
return .get
}
var sampleData: Data {
return Data()
}
var task: Task {
switch self {
case let .search(lat, long):
return .requestParameters(
parameters: [ "latitude": lat, "longitude": long, "limit": 30], encoding: URLEncoding.queryString)
case .details:
return .requestPlain
}
}
var headers: [String : String]? {
return ["Authorization": "Bearer \(apiKey)"]
}
}
Файл AppDelegate
import UIKit
import Moya
import CoreLocation
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {
let window = UIWindow()
let locationService = LocationService()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let service = MoyaProvider<YelpService.BusinessesProvider>()
let jsonDecoder = JSONDecoder()
var navigationController: UINavigationController?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
locationService.didChangeStatus = { [weak self] success in
if success {
self?.locationService.getLocation()
}
}
locationService.newLocation = { [weak self] result in
switch result {
case .success(let location):
self?.loadBusinesses(with: location.coordinate)
case .failure(let error):
assertionFailure("Error getting the users location \(error)")
}
}
switch locationService.status {
case .notDetermined, .denied, .restricted:
let locationViewController = storyboard.instantiateViewController(withIdentifier:
"LocationViewController")
as? LocationViewController
locationViewController?.delegate = self
window.rootViewController = locationViewController
default:
let nav = storyboard
.instantiateViewController(withIdentifier: "StoreNavigationController") as? UINavigationController
self.navigationController = nav
window.rootViewController = nav
locationService.getLocation()
(nav?.topViewController as? StoreTableViewController)?.delegate = self
}
window.makeKeyAndVisible()
return true
}
private func loadDetails(for viewController: UIViewController, withId id: String) {
service.request(.details(id: id)) { [weak self] (result) in
switch result {
case .success(let response):
guard let strongSelf = self else { return }
if let details = try? strongSelf.jsonDecoder.decode(Details.self, from: response.data) {
let detailsViewModel = DetailsViewModel(details: details)
(viewController as? DetailsStoreViewController)?.viewModel = detailsViewModel
}
case .failure(let error):
print("Failed to get details \(error)")
}
}
}
private func loadBusinesses(with coordinate: CLLocationCoordinate2D) {
service.request(.search(lat: coordinate.latitude, long: coordinate.longitude)) { [weak self] (result) in
guard let strongSelf = self else { return }
switch result {
case .success(let response):
let root = try? strongSelf.jsonDecoder.decode(Root.self, from: response.data)
let viewModels = root?.businesses
.compactMap(StoreListViewModel.init)
.sorted(by: { $0.distance < $1.distance})
if let nav = strongSelf.window.rootViewController as? UINavigationController,
let storeListViewController = nav.topViewController as? StoreTableViewController {
storeListViewController.viewModels = viewModels ?? []
} else if let nav = strongSelf.storyboard
.instantiateViewController(withIdentifier: "StoreNavigationController") as?
UINavigationController {
strongSelf.navigationController = nav
strongSelf.window.rootViewController?.present(nav, animated: true) {
(nav.topViewController as? StoreTableViewController)?.delegate = self
(nav.topViewController as? StoreTableViewController)?.viewModels = viewModels ?? []
}
}
case .failure(let error):
print("Error: \(error)")
}
}
}
}
extension AppDelegate: LocationActions, ListActions {
func didTapAllow() {
locationService.requestLocationAuthorization()
}
func didTapCell(_ viewController: UIViewController, viewModel: StoreListViewModel) {
loadDetails(for: viewController, withId: viewModel.id)
}
}
Что-то пропущено или мне нужно добавить / изменить?