如何在Moya中添加参数?

moy*_*e22 6 ios swift moya

所以我一直在研究Gary Tokman的教程来构建一个餐厅查看应用程序,它非常棒。从开始到结束,一切都进展顺利。

目的是更改或添加参数并包括“术语”或“类别”。现在,这会将搜索更改为特定企业,而不仅仅是餐馆。

这就是我陷入困境的地方,我似乎找不到执行此参数的正确语法。

这是业务端点文档: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)"]
    }

}
Run Code Online (Sandbox Code Playgroud)

应用程序委托文件

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么我遗漏或需要添加/更改的吗?

Gle*_*enn 7

欢迎来到 Stackoverflow!

首先,尝试回去研究网络库Moya。以下是其用法示例: https://github.com/Moya/Moya/tree/master/docs/Examples


所以基本上你的问题是如何在 Moya 中添加参数?

嗯,这很简单,特别是如果您很好地掌握了 Moya 的使用。

让我们添加参数termcategories我会让你在这个答案之后自己添加其他参数。

在你的枚举中BusinessProvider,有一个案例search,对吗?而且您已经可以看到两个现有参数,为什么我们不添加一个名为 的新参数term

case search(lat: Double, long: Double, term: String)
Run Code Online (Sandbox Code Playgroud)

由于您要在 中添加参数task,而不是在 中path,那么让我们转到task变量。请记住,您可以在 中添加参数,task但在“task.txt”中添加参数更为实用。

让我们在搜索任务中添加新参数

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

瞧!现在您的案例中有一个新term参数search