我有两个viewControllers给我带来麻烦。一个称为notificationAccessViewController.swift
,另一个称为classChooseViewController.swift
。我在notificationAccessViewController
中有一个按钮,可以触发classChooseViewController
的segue。我需要做的是在prepareForSegue
函数中,执行Alamofire
请求,然后将响应传递给classChooseViewController
。这样可行!但是,还不够快。
以下是prepareForSegue
notificationAccessViewController
功能
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let DestViewController = segue.destination as! classChooseViewController
Alamofire.request("MYURL.com").responseJSON { (response) in
if let JSON : NSDictionary = response.result.value as! NSDictionary?{
let classNameArray = JSON["className"] as! NSArray
print("---")
print(classNameArray)
DestViewController.classNameArray = classNameArray
}
}
}
我把它classNameArray
打印到控制台,它成功了。虽然,在我的classChooseViewController.swift
中,我还将classNameArray
打印到控制台,并且它内部没有打印任何内容。这是因为viewDidLoad()
函数的classChooseViewController.swift
函数在prepareForSegue
函数完成之前运行。我想知道我能做些什么来确保classChooseViewController
在prepareForSegue
函数运行完成之前不会加载。
以下是classChooseViewController
class classChooseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var classNameArray: NSArray = []
override func viewDidLoad() {
super.viewDidLoad()
print(classNameArray)
}
}
我附上了控制台读取内容的图片。您可以在classNameArray
函数之前看到classChooseViewController
viewDidLoad()
函数打印prepareForSegue()
,因为" ---"之后打印出来。
答案 0 :(得分:1)
你的设计错了。
Alamofire request
函数是异步的。它会在结果准备好之前立即返回。然后它调用您传入的完成处理程序。
我倾向于同意Paul的意见,你应该在目标视图控制器中而不是在当前视图控制器中发出请求。
如果您想要在切换到另一个视图控制器之前获取Alamofire中的数据,那么您需要编写一个启动请求的方法,然后从{{1}调用segue到另一个视图控制器} call的完成处理程序。
如果您从按下按钮调用新视图控制器,则不需要将按钮直接链接到segue,而是编写一个触发AlamoFire请求调用的IBAction方法,然后调用segue(或实例化直接查看控制器并从完成处理程序手动推送/显示它。
这样的事情:
Alamofire.request()
顺便说一下,类名和类型应该以大写字母开头,变量名应该以小写字母开头。这是Swift和Objective-C中非常强大的约定,除非你遵循惯例,否则你会混淆其他iOS / Mac开发人员。