所以我一直在研究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)
有什么我遗漏或需要添加/更改的吗?
欢迎来到 Stackoverflow!
首先,尝试回去研究网络库Moya。以下是其用法示例: https://github.com/Moya/Moya/tree/master/docs/Examples
所以基本上你的问题是如何在 Moya 中添加参数?
嗯,这很简单,特别是如果您很好地掌握了 Moya 的使用。
让我们添加参数term。categories我会让你在这个答案之后自己添加其他参数。
在你的枚举中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。
| 归档时间: |
|
| 查看次数: |
8699 次 |
| 最近记录: |