下载JSON数据后执行segue?

时间:2017-04-19 12:15:32

标签: ios swift xcode

我有两个控制器 SearchViewController DetailInfoViewController 首先有textField和submit按钮,第二个 - 两个标签

在textField中我写电影片名,当我按下提交我的模型(Movie.swift)在服务器上发送请求并获得电影信息的响应。 我如何在 DetailInfoViewController 上发送此响应?

Movie.swift

    class Movie {
    let omdbUrl = "http://www.omdbapi.com/?"
    var title: String?
    var filmYear: String?
    var poster: String?

    var delegete: MovieDelegate!

    func getMovieInfo(title: String){
        let params = ["t": title]
        Alamofire.request(omdbUrl, method: .get, parameters: params).validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON { (response) in
            switch response.result {
            case .success(let JSON):
                print(response.response!.statusCode)
                print(response.result.description)
                print("validation successful")
                let response = JSON as! NSDictionary
                print(response)
                let status = response["Response"] as! String
                if status == "True" {
                    self.title = (response["Title"] as! String)
                    self.filmYear = (response["Year"] as! String)
                    self.poster = (response["Poster"] as! String)
                    self.delegete.updateMovieInfo()
                } else {
                    print (response["Error"]!)

                }
            case .failure(let error):
                print (error)

            }
        }

    }
}



    class SearchViewController: UIViewController, MovieDelegate {
    var movie = Movie()
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
    @IBOutlet weak var searchTextField: UITextField!
    @IBOutlet weak var searchButton: UIButton!
    @IBAction func searchButtonTapped(_ sender: UIButton) {
        activityIndicator.startAnimating()
        DispatchQueue.main.async {
            self.movie.getMovieInfo(title: self.searchTextField.text!)
            self.activityIndicator.stopAnimating()
            }

        if self.activityIndicator.isHidden {
            self.performSegue(withIdentifier: "movieInfo", sender: self)

        }
    }
    func updateMovieInfo() {
        print(movie.title!)
        print(movie.filmYear!)
        print(movie.poster!)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.
    }

    //MARKL: Delegate


}


    class DetailInfoViewController: UIViewController, MovieDelegate {

    @IBOutlet weak var posterImageView: UIImageView!
    @IBOutlet weak var filmNameLabel: UILabel!
    @IBOutlet weak var filmYearLabel: UILabel!
    var movie = Movie()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.movie.delegete = self
        filmNameLabel.text = self.movie.title
        filmYearLabel.text = self.movie.filmYear
        updateMovieInfo()
    }
    // MARK: - Navigation
    func updateMovieInfo() {
        print(movie.title!)
        print(movie.filmYear!)
        print(movie.poster!)
    }

}

1 个答案:

答案 0 :(得分:0)

您需要一个完成处理程序。像这样的东西,

func getMovieInfo(title: String, completion: ()->(){
        let params = ["t": title]
        Alamofire.request(omdbUrl, method: .get, parameters: params).validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON { (response) in
            switch response.result {
            case .success(let JSON):
                print(response.response!.statusCode)
                print(response.result.description)
                print("validation successful")
                let response = JSON as! NSDictionary
                print(response)
                let status = response["Response"] as! String
                if status == "True" {
                    self.title = (response["Title"] as! String)
                    self.filmYear = (response["Year"] as! String)
                    self.poster = (response["Poster"] as! String)
                    self.delegete.updateMovieInfo()
                    completion()
                } else {
                    print (response["Error"]!)

                }
            case .failure(let error):
                print (error)

            }
        }

    }
    }


   DispatchQueue.main.async {
     self.movie.getMovieInfo(title: self.searchTextField.text!) {
        self.activityIndicator.stopAnimating()
        self.performSegue(withIdentifier: "movieInfo", sender: self)
       }
    }