2016-10-21 16 views
1

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

Пример 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 

    } 
} 

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

ответ

0

Возможно, вам не удастся создать объект класса 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) 
      } 
     } 
    ........ 
} 
+0

let фильмArray: [фильмModel]? не создает массив, который создает свойство movieModel, также [movieModel] не имеет членского добавления, и даже если бы это было так, это не сработало бы, так как оно было определено как константа с «let». Спасибо за помощь, я продолжу поиск. – Wrenzoe

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^