Сопоставление двух типов ответов с помощью Alamofire и AlamofireObjectMapperIOS

Программируем под IOS
Ответить
Anonymous
 Сопоставление двух типов ответов с помощью Alamofire и AlamofireObjectMapper

Сообщение Anonymous »

Я создаю приложение iOS для поиска фильма в базе данных imdb (с использованием API omdb), и пользователь может сохранять избранное.
Для поиска по imdbTitle URL-адрес запроса: " https://www.omdbapi.com/?s=(imdbTitle)&type=movie", если, например, imdbTitle = "arq", ответ будет такой:

Код: Выделить всё

{
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;
}
Но для сохранения фильма мне нужно выполнить поиск по imdbID, URL: «https://www.omdbapi.com/?i=(imdbID)», если imdbID — тот, который указан фильм был найден, imdbID = tt3829612, и ответ:

Код: Выделить всё

{
Actors = "Robbie Amell, Rachael Taylor, Shaun Benson, Gray Powell";
Awards = "N/A";
BoxOffice = "N/A";
Country = "USA, Canada";
DVD = "16 Sep 2016";
Director = "Tony Elliott";
Genre = "Sci-Fi, Thriller";
Language = English;
Metascore = "N/A";
Plot = "Trapped in a lab and stuck in a time loop, a disoriented couple fends off masked raiders while harboring a new energy source that could save humanity.";
Poster = "https://images-na.ssl-images-amazon.com/images/M/MV5BMjAxODQ2MzkyMV5BMl5BanBnXkFtZTgwNjU3MTE5OTE@._V1_SX300.jpg";
Production = Netflix;
Rated = "N/A";
Ratings =     (
{
Source = "Internet Movie Database";
Value = "6.4/10";
},
{
Source = "Rotten Tomatoes";
Value = "60%";
}
);
Released = "16 Sep 2016";
Response = True;
Runtime = "88 min";
Title = ARQ;
Type = movie;
Website = "N/A";
Writer = "Tony Elliott";
Year = 2016;
imdbID = tt5640450;
imdbRating = "6.4";
imdbVotes = "17,481";
}
Итак, мой класс Movie должен иметь следующие атрибуты: постер, заголовок, время выполнения, жанр, режиссер, актеры, сюжет, выпуск, imdbID и imdbRating (чтобы показать это в моем представлении пользовательского интерфейса). , кроме imdbID, конечно)
Я новичок и меня слишком смущают все эти вещи (никогда раньше не работал с данными API).
В любом случае, после долгих поисков я обнаружил, что есть способ получить этот ответ в виде массива с помощью AlamofireObjectMapper.
У меня уже есть функции запроса:

Код: Выделить всё

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)
}
}
//------------------------------------------------

}
func getMovieFromJson(imdbID: String, completionHandler: @escaping (Dictionary) -> ()) {

let urlById: String = "https://www.omdbapi.com/?i=\(imdbID)"

//returns a single movie information
//------------------------------------------------
Alamofire.request(urlById).responseJSON {
response in

if let moviesJSON = response.result.value {
completionHandler(moviesJSON as! Dictionary)
}
}
//------------------------------------------------
}
Итак, может ли кто-нибудь объяснить мне (как вы объясняете ребенку), как мне сделать это сопоставление? Я создал Movie.swift и в этот файл помещу свой класс Movie и класс MovieDAO.
Как я могу реализовать эти два класса с помощью AlamofireObjectMapper и кого мне нужно изменить в моем запросе методы?
Обновление:

Код: Выделить всё

class Movie {

let poster: String?
let title: String?
let runtime: String?
let genre: String?
let director: String?
let actors: String?
let plot: String?
let released: String?
let imdbID: String?
let imdbRating: String?

init(poster: String?, title: String?, runtime: String?, genre: String?, director: String?, actors: String?, plot: String?, released: String?, imdbID: String?, imdbRating: String?) {

//checking if is nil

if let isPoster = poster {
self.poster = isPoster
} else {
self.poster = nil
}

if let isTitle = title {
self.title = isTitle
} else {
self.title = nil
}

if let isGenre = genre {
self.genre = isGenre
} else {
self.genre = nil
}

if let isRuntime = runtime {
self.runtime = isRuntime
} else {
self.runtime = nil
}

if let isDirector = director {
self.director = isDirector
} else {
self.director = nil
}

if let isActors = actors {
self.actors = isActors
} else {
self.actors = nil
}

if let isPlot = plot {
self.plot = isPlot
} else {
self.plot = nil
}

if let isReleased = released {
self.released = isReleased
} else {
self.released = nil
}

if let isImdbID = imdbID {
self.imdbID = isImdbID
} else {
self.imdbID = nil
}

if let isImdbRating = imdbRating {
self.imdbRating = isImdbRating
} else {
self.imdbRating = nil
}
}
}
ОБНОВЛЕНИЕ 2
Я объявляю переменную movieDetail, как вы сказали, но xcode показал ошибку и предложил добавить параметры, так я и сделал, но проблема не решена.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/434 ... jectmapper
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»