Advertisement
Guest User

Untitled

a guest
May 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 4.16 KB | None | 0 0
  1. import UIKit
  2. import RealmSwift
  3. import Alamofire
  4. import AlamofireImage
  5.  
  6. class SearchResultsViewController: UIViewController, UISearchBarDelegate {
  7.    
  8.     @IBOutlet weak var searchBar: UISearchBar!
  9.     @IBOutlet weak var searchResults: UITableView!
  10.     var IMDbAPI = IMDBService.init(root:URL.init(string: "https://www.omdbapi.com/")!)
  11.     let realm = try! Realm()
  12.    
  13.     var movieTitle: String?
  14.  
  15.     override func viewDidLoad() {
  16.         super.viewDidLoad()
  17.         searchResults.delegate = self
  18.         searchResults.dataSource = self
  19.         self.searchResults.rowHeight = 150
  20.         searchBar.delegate = self
  21.         self.navigationItem.title = "Search: "
  22.        
  23.        
  24.     }
  25.    
  26.     func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
  27.         print(#function)
  28.        
  29.         guard let textToRequest = searchBar.text else { return }
  30.        
  31.         /*
  32.           - Cerco dal database gli oggetti movie
  33.           - filtrandoli se contengono la stringa cercata
  34.           - trasformo il risultato in un'array di stringhe ( il map )
  35.          */
  36.         let titleMovies = Array(
  37.             self.realm
  38.                 .objects(RealmMovie.self)
  39.                 .filter("title CONTAINS[c] '\(textToRequest)'")
  40.             ).map({ $0.title })
  41.        
  42.         print("database set: \(titleMovies)")
  43.    
  44.         IMDbAPI.getFilm(byTitle: textToRequest) { [weak self] (response) in
  45.             guard let self = self else { return }
  46.            
  47.             switch response {
  48.             case .success(let result):
  49.                
  50.                 print("founded:", result.title)
  51.                
  52.                 // se il titolo restituito è presente nell'array di titoli vuol dire che il film è già nel DB
  53.                 guard !titleMovies.contains(result.title) else {
  54.                     print("(movie: \(result.title)) already in database")
  55.                     return
  56.                 }
  57.                
  58.                 // salvo il film sul db
  59.                 guard let realmMovie = self.saveMovie(from: result) else { return }
  60.                
  61.                 print("(film: \(result.title)) added to database")
  62.                
  63.                 // recupero tutto gli attori e trasformo il risultato in un'array di stringhe
  64.                 let actorsName = self.realm.objects(RealmActor.self).map({ $0.name })
  65.                
  66.                 for actor in result.actorsArray {
  67.                    
  68.                     // se l'attore è nell'array di nomi è già sul db, quindi passo al prossimo ciclo
  69.                     guard !actorsName.contains(actor.name) else {
  70.                         continue
  71.                     }
  72.                    
  73.                     print("add actor: ", actor.name)
  74.                    
  75.                     self.addActor(name: actor.name, movie: realmMovie)
  76.                    
  77.                 }
  78.                
  79.             case .failure(let err):
  80.                 print("Unable to retrieve data from API request", err)
  81.             }
  82.         }
  83.        
  84.     }
  85.    
  86.     func addActor(name: String, movie: RealmMovie) {
  87.         let newActor = RealmActor.init()
  88.         newActor.name = name
  89.         newActor.movies.append(movie)
  90.        
  91.         do {
  92.             try self.realm.write {
  93.                 self.realm.add(newActor)
  94.             }
  95.         } catch let e {
  96.             print(e)
  97.         }
  98.     }
  99.    
  100.     func saveMovie(from movie: Movie) -> RealmMovie? {
  101.        
  102.         let realmMovie = RealmMovie.init()
  103.        
  104.         realmMovie.title = movie.title
  105.         realmMovie.plot = movie.plot
  106.         realmMovie.year = movie.year
  107.         realmMovie.imdbRating = movie.imdbRating
  108.         realmMovie.website = movie.website
  109.         realmMovie.type = movie.type
  110.         realmMovie.poster = movie.poster // Si deve fare la request per ottenere l'image qui!
  111.         realmMovie.actors = movie.actors
  112.        
  113.         do {
  114.             try self.realm.write {
  115.                 self.realm.add(realmMovie)
  116.             }
  117.            
  118.             return realmMovie
  119.            
  120.         } catch {
  121.             print("Unable to save Movie data \(error)")
  122.             return nil
  123.         }
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement