AlamoFireObjectMapper не удается сохранить ответ данных в массиве объектов

#ios #json #swift #get #alamofire

#iOS #json #swift #получить #alamofire

Вопрос:

Я использую AlamoFireObjectMapper, чтобы попытаться сопоставить какой-нибудь простой JSON с некоторыми моделями классов. Кажется, что я могу правильно извлечь JSON и распечатать его, однако, когда я пытаюсь добавить свой ответ в массив типа моего класса, это не работает.

Пример JSON: SampleJson

 class MovieResults: Mappable {

var movieResults: [MovieInfo]?

required init?(map: Map) {
    mapping(map: map)
   }

func mapping(map: Map) {
    // An array of objects
    self.movieResults <- map["results"]
   }
}

class MovieInfo: Mappable {

var movieTitle: String?
var movieID: Int?
var movieRating: String?
var movieReleaseDate: String?
var inTheaters: Bool?

var movieResults: [MovieInfo]?


required init?(map: Map) {

}

func mapping(map: Map) {
    self.movieTitle <- map["title"]
    self.movieID <- map["id"]
    self.movieRating <- map["rating"]
    self.movieReleaseDate <- map["release_date"]
    self.inTheaters <- map["in_theaters"]
   }
}
  

ViewController:

 class resultViewController: UITableViewController {

var searchTerm: String?
var movieArray = [MovieInfo]()

override func viewDidLoad() {
    super.viewDidLoad()
    fetchAPI(search: searchTerm!)
}

func fetchAPI(search: String) {
    let gboxAPI = "rK5M0dCTUd268hk121BpNpEAxMOmFuNh"
    let URL = "http://api-public.guidebox.com/v1.43/US/(gboxAPI)/search/movie/title/(searchTerm!)/fuzzy"


    Alamofire.request(URL).responseObject { ( response: DataResponse<MovieResults>) in

        let result = response.result.value

        if let movies = result?.movieResults {
            for item in movies {
                self.movieArray.append(item) //this doesn't work
                print(item.movieTitle) //this works
            }
        }
    }

    /* This doesn't print anything
        for some reason my array isn't truly being 
        popluated in the above fetchAPI call
    */
    for item in movieArray {
        print(item.movieTitle)
    }

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

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

    let cell = UITableViewCell(style: .value1, reuseIdentifier: "UITableViewCell")

    let movieItem = movieArray[indexPath.row]

    cell.textLabel?.text = movieItem.movieTitle
    cell.detailTextLabel?.text = movieItem.movieRating

    return cell

    }
}
  

Я ни за что на свете не могу понять, почему я могу печатать, но не хранить свои данные. Это просто не подходит для меня.

Ответ №1:

Возможно, вам не удастся создать объект Mappable класса, чтобы вы могли добавлять к нему данные. Вместо этого вы можете создать другой класс модели и использовать его объект.

 class movieModel: NSObject {
    var movieTitle: String?
    var movieID: Int?
    var movieRating: String?
    var movieReleaseDate: String?
    var inTheaters: Bool?
}
  

Теперь создайте объекты этого класса в resultViewController и используйте его для хранения деталей фильма.

 class resultViewController: UITableViewController {
    let movieArray: [movieModel]? //create array of movieModel object
    .......
      ........
        if let movies = result?.movieResults {
           for item in movies {
              let movie = movieModel()//create object of movieModel
              movie.movieTitle = item.movieTitle
              movie.movieID = item.movieID
              movie.movieRating = item.movieRating
              movie.movieReleaseDate = item.movieReleaseDate
              movie.inTheaters = item.inTheaters

              self.movieArray.append(self.movie)
              print(item.movieTitle)
           }
       }
    ........
}
  

Комментарии:

1. пусть movieArray: [movieModel]? не создает массив, который создает свойство movieModel, также [movieModel] не имеет элемента ‘append’, и даже если бы это было так, это не сработало бы, поскольку оно определено как константа с помощью ‘let’. Спасибо за помощь, я продолжу поиск.

Ответ №2:

Запрос является асинхронным. Блок не выполняется до тех пор, пока не будет получен ответ от сервера.
Ваш цикл for выполняется непосредственно после запуска запроса. Запустите self.tableView.reloadData() после добавления новых объектов, и это должно сработать.