swift中数据更改后如何更改变量
我正在使用一个API来了解API是如何工作的,我编写了一个函数,从web获取数据并将其解析到我的模型中,但是当我想打印该模型中的任何内容时,它都不工作,除非它在我的函数中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
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服务调用它是异步的。正在发生的是预期的行为。在不同的线程中运行长时间运行的操作是一种很好的做法,这样主线程就不会被阻塞。如果你想了解这个主题,有很多资源,例如关于或