因此,我正在使一个iOS应用程序在imdb数据库中搜索电影(使用omdb api),并且用户可以保存收藏夹。

要通过imdbTitle进行搜索,例如,如果imdbTitle =“ arq”,则请求URL为“ https://www.omdbapi.com/?s=(imdbTitle)&type=movie”,响应为:

{
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(要在我的UI视图上显示,当然除了imdbID除外)

我是一个初学者,我对所有这些东西都感到困惑(以前从未使用过API数据)。

无论如何,经过大量搜索之后,我发现有一种方法可以使用AlamofireObjectMapper作为数组获得此响应。

我已经有了我的请求功能:

func searchMoviesOnJson(imdbTitle: String, completionHandler: @escaping (Dictionary<String, Any>?) -> ()) {

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<String, Any>)

    case .failure(_):
        completionHandler(nil)
    }
}
//------------------------------------------------

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

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


因此,有人可以向我解释(例如您会向孩子解释)我该如何进行映射?我创建了一个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显示了一个错误并建议我可以添加参数,所以我做到了,但没有解决。

ios - 使用Alamofire和AlamofireObjectMapper映射两种响应(iOS-swift)-LMLPHP

最佳答案

您将必须解析收到的JSON:
例如如果收到的json是:

{
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;
}


如前所述,如果您已将json响应存储在NSDictionary中

您可以按以下方式访问搜索结果的值:

var moviesArray = [Movie]() //array of your Movie class

var imdbIdArray = [String]()


if let searchResults = moviesJSON["Search"] as? NSArray {
    for searchResult in searchResults {
      let movieResult = searchResult as! Dictionary<String,String>
      let movieDetail = Movie()
      movieDetail.title = movieResult["Title"]
      movieDetail.type = movieResult["Type"]
    //similarly you can do it for other params as well
      moviesArray.append(movieDetail)
      let imdbId = movieResult["imdbId"]
      imdbIdArray.append(imdbId)
    }

}

class Movie: NSObject {
    var title = String()
    var type = String()
}


现在,moviesArray由结果集中返回的电影列表组成。

10-06 12:04