Ich muss einen Film auf der API suchen und auf meinem Tisch die gesuchten Filme ansehen.
Sprache
Swift 3 - xcode 8
Funktion zum Abrufen von Json von der API
Code: Select all
func searchMoviesOnJson(imdbTitle: String, completionHandler: @escaping (Dictionary?) -> ()) {
let urlByName: String = "https://www.omdbapi.com/?s=\(imdbTitle)&type=movie"
//returns a list of movies that contains the title searched
//------------------------------------------------
Alamofire.request(urlByName).responseJSON {
response in
switch response.result {
case .success(let value):
let moviesJSON = value
completionHandler(moviesJSON as? Dictionary)
case .failure(_):
completionHandler(nil)
}
}
//------------------------------------------------
Code: Select all
class Movie {
var poster: String?
var title : String?
var year : String?
var imdbID: String?
init(poster: String?, title: String?, year: String?, imdbID: String?) {
if let isPoster = poster { self.poster = isPoster }
else { self.poster = nil }
if let isTitle = title { self.title = isTitle }
else { self.title = nil }
if let isYear = year { self.year = isYear }
else { self.year = nil }
if let isImdbID = imdbID { self.imdbID = isImdbID }
else { self.imdbID = nil }
}
}
Code: Select all
class MovieDAO {
//Search By Title
static func getMovies(imdbTitle: String, completionHandler: @escaping (([Movie]) -> ())) {
searchMoviesOnJson(imdbTitle: imdbTitle, completionHandler: {
newMoviesJSON in
if let moviesJSON = newMoviesJSON {
if moviesJSON["Error"] != nil { return }
else {
//casting
let arrayOfMovies: [[String : String]] = newMoviesJSON!["Search"] as! [[String : String]]
var fetchedMovies = [Movie]()
for eachFetchedMovie: [String : String] in arrayOfMovies {
var poster: String?
var title : String?
var year : String?
var imdbID: String?
if let isPoster = eachFetchedMovie["Poster"] { poster = isPoster }
else { poster = nil }
if let isTitle = eachFetchedMovie["Title"] { title = isTitle }
else { title = nil }
if let isYear = eachFetchedMovie["Year"] { year = isYear }
else { year = nil }
if let isImdbID = eachFetchedMovie["imdbID"] { imdbID = isImdbID }
else { imdbID = nil }
let movie: Movie = Movie(poster: poster, title: title, year: year, imdbID: imdbID)
fetchedMovies.append(movie)
}
completionHandler(fetchedMovies)
}
}
})
}
}
Wie kann ich diese Funktion nun testen? Ich nenne es in meinem AppDelegate wie folgt:
Code: Select all
print(MovieDAO.getMovies(imdbTitle: "arq"))
Oh, ich möchte ein Array mit dem gesuchten Titel drucken. Ich bin mir fast sicher, dass meine Funktion das nicht zurückgibt. Wie kann ich die Funktion dafür anpassen?
Zum besseren Verständnis stellt die API diesen JSON-Code für den gesuchten Film bereit:
Code: Select all
{
Response = True;
Search = (
{
Poster = "https://images-na.ssl-images-amazon.com/images/M/MV5BMjAxODQ2MzkyMV5BMl5BanBnXkFtZTgwNjU3MTE5OTE@._V1_SX300.jpg";
Title = ARQ;
Type = movie;
Year = 2016;
imdbID = tt5640450;
},
{
Poster = "N/A";
Title = Arq;
Type = movie;
Year = 2011;
imdbID = tt2141601;
},
{
Poster = "N/A";
Title = "A.R.Q.";
Type = movie;
Year = 2015;
imdbID = tt3829612;
}
);
totalResults = 3;
}
Mir gefiel der Vorschlag und ich rief (auf meinem AppDelegate an, nur zum Testen und Ansehen Wenn es das bekommt, was ich will, in diesem Fall eine Liste der Filme, die das „arq“ im Titel enthalten), sieht meine Funktion wie folgt aus:
Code: Select all
MovieDAO.getMovies(imdbTitle: "arq") {
(movies: [Movie]) in
// Do something with the movies
print(movies)
}
Was stimmt mit dieser grünen Zeile nicht?