Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift中数据更改后如何更改变量_Swift_Api_Parsing_Model - Fatal编程技术网

swift中数据更改后如何更改变量

swift中数据更改后如何更改变量,swift,api,parsing,model,Swift,Api,Parsing,Model,我正在使用一个API来了解API是如何工作的,我编写了一个函数,从web获取数据并将其解析到我的模型中,但是当我想打印该模型中的任何内容时,它都不工作,除非它在我的函数中 import UIKit class MovieDetailViewController: UIViewController { var selectedMovie : Int? var movieDetail : MovieDetailModel? = nil override func viewDid

我正在使用一个API来了解API是如何工作的,我编写了一个函数,从web获取数据并将其解析到我的模型中,但是当我想打印该模型中的任何内容时,它都不工作,除非它在我的函数中

import UIKit

class MovieDetailViewController: UIViewController {

    var selectedMovie : Int?
    var movieDetail : MovieDetailModel? = nil

override func viewDidLoad() {
    super.viewDidLoad()
    getMovioesDetail(url: "\(URLs().baseURL)/movie/\(selectedMovie!)\(URLs().API_key)")
    print(movieDetail?.backdrop_path)
    // It does not print the path
}

//MARK: - Functions

func getMovioesDetail (url: String) {
    WebServices().get(url) { (type, model : MovieDetailModel?) in
        switch type {
        case .Succeed :
            self.movieDetail = model
            print(self.movieDetail?.backdrop_path)
            // It prints the path
        case .Failed : print("Failed")
        case .FailedDecode : print("FailedDecode")
        default : break
        }
    }
}
}

如果不了解更多关于
WebServices的信息,就很难了解

我猜
WebServices().get(url)
在另一个线程中异步运行,因此在API请求返回数据时调用闭包,这就是打印工作的原因

当您在
视图中执行代码时,DIDLOAD
正在主线程上运行。在调用
getMoviesDetail
之后,会立即执行
print(movieDetail?.background\u路径)
,并且很可能
movieDetail
仍然是
nil
,因为
WebService
尚未完成

要确定变化:

print(movieDetail?.backdrop_path)
为此:

print(movieDetail?.backdrop_path ?? "Movie detail not available yet")

如果web服务运行得非常快,您将看到两次打印的路径,如果不打印,您将首先看到尚未可用的电影详细信息,然后是路径。

正如Aaron Cyrman所述,您的函数包括web服务调用,web服务异步运行,这意味着当您收到响应时它是未知的

这就是为什么如果你想打印出一些东西或者重新加载你的tableview/collectionview,以防失败;调用函数后不正确

此外,你最好在填充模型类后对其进行零检查

举个例子:

case .Succeed:
    self.movieDetail = model
    if self.movieDetail != nil{
        print(movieDetail!.backdrop_path)
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
break

我编写了
print(movieDetail?.background\u path??“movieDetail not available”)
并打印了尚未可用的电影细节。我们现在可以确认web服务调用它是异步的。正在发生的是预期的行为。在不同的线程中运行长时间运行的操作是一种很好的做法,这样主线程就不会被阻塞。如果你想了解这个主题,有很多资源,例如关于或