Как добавить параметры в Мойя? - PullRequest
1 голос
/ 10 марта 2020

Итак, я работал над этим уроком Гари Токманом , чтобы создать приложение для просмотра в ресторане, и это здорово. С начала и до конца все работает правильно и хорошо.

Цель состоит в том, чтобы изменить или добавить параметры и включить либо «термин», либо «категории». Тогда это теперь изменит поиск на конкретную 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)
    }
}

Что-то пропущено или мне нужно добавить / изменить?

1 Ответ

0 голосов
/ 10 марта 2020

Добро пожаловать в Stackoverflow!

Прежде всего, попробуйте вернуться к изучению этой сетевой библиотеки Моя . Вот примеры его использования: https://github.com/Moya/Moya/tree/master/docs/Examples


Итак, в основном ваш вопрос как добавить параметры в Мойя?

Ну, это довольно просто, особенно если у вас есть хороший * * * * * * * * * * Мойя.

Давайте добавим параметр term. Я позволю вам добавить другой параметр categories самостоятельно после этого ответа.

В вашем перечислении BusinessProvider есть регистр search, верно? И вы уже можете видеть два существующих параметра, почему бы нам не добавить новый параметр с именем term?

case search(lat: Double, long: Double, term: String)

Поскольку вы добавляете параметр в ваш task, а не в path, тогда давайте go к переменной task. Помните, что вы можете добавить параметры в task, но более практично сделать это в `task.

Давайте добавим новый параметр в search task

case let .search(lat, long, term):
            return .requestParameters(
                parameters: [ "latitude": lat, "longitude": long, "term": term, "limit": 30], encoding: URLEncoding.queryString)

Вуаля! Теперь у вас есть новый term параметр в вашем search случае.

...