Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import UIKit
- import RealmSwift
- import Alamofire
- import AlamofireImage
- class SearchResultsViewController: UIViewController, UISearchBarDelegate {
- @IBOutlet weak var searchBar: UISearchBar!
- @IBOutlet weak var searchResults: UITableView!
- var IMDbAPI = IMDBService.init(root:URL.init(string: "https://www.omdbapi.com/")!)
- let realm = try! Realm()
- var movieTitle: String?
- override func viewDidLoad() {
- super.viewDidLoad()
- searchResults.delegate = self
- searchResults.dataSource = self
- self.searchResults.rowHeight = 150
- searchBar.delegate = self
- self.navigationItem.title = "Search: "
- }
- func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
- print(#function)
- guard let textToRequest = searchBar.text else { return }
- /*
- - Cerco dal database gli oggetti movie
- - filtrandoli se contengono la stringa cercata
- - trasformo il risultato in un'array di stringhe ( il map )
- */
- let titleMovies = Array(
- self.realm
- .objects(RealmMovie.self)
- .filter("title CONTAINS[c] '\(textToRequest)'")
- ).map({ $0.title })
- print("database set: \(titleMovies)")
- IMDbAPI.getFilm(byTitle: textToRequest) { [weak self] (response) in
- guard let self = self else { return }
- switch response {
- case .success(let result):
- print("founded:", result.title)
- // se il titolo restituito è presente nell'array di titoli vuol dire che il film è già nel DB
- guard !titleMovies.contains(result.title) else {
- print("(movie: \(result.title)) already in database")
- return
- }
- // salvo il film sul db
- guard let realmMovie = self.saveMovie(from: result) else { return }
- print("(film: \(result.title)) added to database")
- // recupero tutto gli attori e trasformo il risultato in un'array di stringhe
- let actorsName = self.realm.objects(RealmActor.self).map({ $0.name })
- for actor in result.actorsArray {
- // se l'attore è nell'array di nomi è già sul db, quindi passo al prossimo ciclo
- guard !actorsName.contains(actor.name) else {
- continue
- }
- print("add actor: ", actor.name)
- self.addActor(name: actor.name, movie: realmMovie)
- }
- case .failure(let err):
- print("Unable to retrieve data from API request", err)
- }
- }
- }
- func addActor(name: String, movie: RealmMovie) {
- let newActor = RealmActor.init()
- newActor.name = name
- newActor.movies.append(movie)
- do {
- try self.realm.write {
- self.realm.add(newActor)
- }
- } catch let e {
- print(e)
- }
- }
- func saveMovie(from movie: Movie) -> RealmMovie? {
- let realmMovie = RealmMovie.init()
- realmMovie.title = movie.title
- realmMovie.plot = movie.plot
- realmMovie.year = movie.year
- realmMovie.imdbRating = movie.imdbRating
- realmMovie.website = movie.website
- realmMovie.type = movie.type
- realmMovie.poster = movie.poster // Si deve fare la request per ottenere l'image qui!
- realmMovie.actors = movie.actors
- do {
- try self.realm.write {
- self.realm.add(realmMovie)
- }
- return realmMovie
- } catch {
- print("Unable to save Movie data \(error)")
- return nil
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement