1

私はしばらくの間、spoonacular API を使用してレシピを検索できるレシピ アプリを使用してきました。JSONデータを配列に正常に保存しましたが、ユーザーが何かを検索したときにデータをテーブルビューに取得する方法がわかりませんか? これまでの私のコードは次のとおりです。

JSON ファイルを取得してデータを読み取る方法:

Class APIRequest() {

static let instance = APIRequest()

var query:String = ""
var url: String = ""
var testString: String = ""

func setQuery(_ query: String) -> Void {
    self.query = query
}

func getReturn(completed: @escaping (Result<Response, Error>) -> Void) {
    // TODO MAJOR!
    // Expressions are not allowed at top level will occur otherwise
    //

    let headers = [
        "x-rapidapi-host": "spoonacular-recipe-food-nutrition-v1.p.rapidapi.com",
        "x-rapidapi-key": "e44daac5e0mshc682df24497a89fp1c4513jsn7067934f0b9b"
    ]

    var request = URLRequest(url: URL(string: "https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/search?number=2&query=\(query)")!,
                             cachePolicy: .useProtocolCachePolicy,
                             timeoutInterval: 10.0)
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request) { (data, response, error) -> Void in
        if let error = error { completed(.failure(error));  return }
        do {
            let result = try JSONDecoder().decode(Response.self, from: data!)
            completed(.success(result))

        } catch {
            completed(.failure(error))
        }
    }
    dataTask.resume()
}

私のレシピクラス:

class Recipe: Codable {
let id: Int
let image: String
let title: String
let readyInMinutes: Int

init(id: Int, image: String = "Default", title: String = "Title", readyInMinutes: Int) {
    self.id = id
    self.image = image
    self.title = title
    self.readyInMinutes = readyInMinutes
}
}

レシピハンドラー:

class RecipeHandler {

static let instance = RecipeHandler()

var allRecipeResults: [Recipe] = []
}

それから、私は確信が持てないこの応答構造体を持っています:

struct Response: Codable {
   struct Result: Codable {
       let id: Int
       let title: String
       let image: String
       let readyInMinutes: Int
   }
   let results: [Result]
   }

そして私の RecipeViewController:

class RecipeViewController: UITableViewController {

@IBOutlet var recipeTable: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    recipeTable.delegate = self
    recipeTable.dataSource = self


}


}


//MARK: - Add cell
extension RecipeViewController {

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return RecipeHandler.instance.allRecipeResults.count
    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "RecipeCell") as? RecipeTableViewCell{
        let recipeItem = RecipeHandler.instance.allRecipeResults[indexPath.row]
        cell.recipeImage.image = UIImage(named: recipeItem.image)
        cell.recipeTitle.text = recipeItem.title
        cell.recipeTime.text = "\(recipeItem.readyInMinutes)"
        return cell
    }
    return UITableViewCell()
    }
    }

//MARK: - SearchBarSearchButtinClicked
extension RecipeViewController: UISearchBarDelegate{
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    guard let searchBarText = searchBar.text else {return}
    let request = APIRequest.instance
    request.query = searchBarText
    request.getReturn { result in
        switch result {
            case .success(let result):
                print(result.results)
                //Don't know what to do here?

            case .failure(let error):
                print(error)
        }
    }

}
}
4

1 に答える 1

0

あなたは正しい考えを持っているようです...RecipeHandlerシングルトンを単純なデータモデルとして使用し、そのモデルからデータを取得しようとしていますtableView:cellForRowAtIndexPath:. モデルにデータを入れたことがないので、何も出てきません。

        case .success(let result):
            print(result.results)
            //Don't know what to do here?

リクエストを行った後、.successハンドラーが呼び出されますか? 結果は印刷されますか? いいえの場合は、応答の処理とデコードの問題を探す必要があります。Resultそれ以外の場合は、 をレシピに変換してモデルに追加します。

于 2019-12-03T22:33:31.047 に答える