阵列打印与API调用相同

时间:2017-05-21 18:48:38

标签: ios swift alamofire

我正在建立一个应用程序,您输入成分,然后根据您的输入返回一堆食谱。我正在使用alamofire调用API,这些似乎是成功的。我遇到的问题是我的测试调用中的6个结果是重复1个配方6次而不是将所有结果返回到单独的单元格中。这是API调用代码:

import Alamofire

class RecipeAp: NSObject{

var concoctions = [RecipeDetails]()

func provideRecipeDetailsForName(name: String, completed:@escaping ([RecipeDetails]) -> Void) {
    let urlSearchString = URL_FULL + "onion" + "soup"
    Alamofire.request(urlSearchString).responseJSON(completionHandler: { response in
        let details = RecipeDetails()
        let result = response.result
        if let dict = result.value as? Dictionary<String, AnyObject> {

            if let matches = dict["matches"] as? [[String: Any]] {
                for ingredient in matches {
                    if let name = ingredient["ingredients"] as? [String] {
                        details.ingredients = name
                        self.concoctions.append(details)

                    }
                }

                for recipeName in matches {
                    if let name = recipeName["recipeName"] as? String {
                        details.recipeTitle = name
                        print("the recipe name = \(name.debugDescription)")
                        self.concoctions.append(details)

                    }

                }

            }

            completed(self.concoctions)

        }



    })

}

}

这是我的模特:

  class RecipeDetails: NSObject {
   var recipeID: String?
   var recipeImageURL: String?
   var recipeTitle: String?
   var recipeSourceURL: String?
   var recipePublisher: String?
   var ingredients: [String]?
}

这是我的customCell设置

   import UIKit

 class RecipeListCustomCell: UITableViewCell {


@IBOutlet weak var recipeTitle: UILabel!
@IBOutlet weak var recipeUrl: UILabel!

var recipe: RecipeDetails? {

    didSet {

        updateView()

    }

}

func updateView() {

    recipeTitle.text = recipe?.recipeTitle
    recipeUrl.text = recipe?.recipeSourceURL


   }

 }

最后这是我的viewController

 import UIKit

 class MainVC: UIViewController {

@IBOutlet weak var tableView: UITableView!

var recipe = RecipeAp()
var results = [RecipeDetails]()

override func viewDidLoad() {
    super.viewDidLoad()

    loadRecipes()

}


     func loadRecipes() {

    recipe.provideRecipeDetailsForName(name: "onion" + "soup") { (response) in

        self.results = response
        self.tableView.reloadData()

    }

   }

 }

 extension MainVC: UITableViewDataSource {

 func tableView(_ tableView: UITableView, numberOfRowsInSection 
 section: Int) -> Int {
    return results.count
}

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
  IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: 
    "RecipeListCustomCell", for: indexPath) as! RecipeListCustomCell
    let recipe = results[indexPath.row]
    cell.recipe = recipe

    return cell


   }

 }

不确定如何在每个单元格中单独显示所有配方。我还附上了一些屏幕截图,介绍了我从API和模拟器中显示的内容。

simulator output

result back from Api

1 个答案:

答案 0 :(得分:0)

您只为每个响应创建一个RecipeDetails实例。因此,您会在self.concoctions重复添加完全相同的引用。

你可能需要写这样的东西:

func provideRecipeDetailsForName(name: String, completed: @escaping ([RecipeDetails]) -> Void) {
    let urlSearchString = URL_FULL + "onion" + "soup"
    Alamofire.request(urlSearchString).responseJSON(completionHandler: { response in
        let result = response.result
        if let dict = result.value as? Dictionary<String, AnyObject> {

            if let matches = dict["matches"] as? [[String: Any]] {
                for match in matches {
                    //### Create a new instance for each iteration.
                    let details = RecipeDetails()
                    if let ingredients = match["ingredients"] as? [String] {
                        details.ingredients = ingredients
                    }
                    if let recipeName = match["recipeName"] as? String {
                        details.recipeTitle = recipeName
                        print("the recipe name = \(recipeName.debugDescription)")
                    }
                    //### Add the instance once in the iteration
                    self.concoctions.append(details)
                }
            }

            completed(self.concoctions)
        }
    })
}