#ios #json #swift #get #alamofire
#iOS #json #swift #получить #alamofire
Вопрос:
Я использую AlamoFireObjectMapper, чтобы попытаться сопоставить какой-нибудь простой JSON с некоторыми моделями классов. Кажется, что я могу правильно извлечь JSON и распечатать его, однако, когда я пытаюсь добавить свой ответ в массив типа моего класса, это не работает.
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()
после добавления новых объектов, и это должно сработать.