viewDidLoad()在prepareforsegue中的Alamofire请求有机会完成之前运行

时间:2017-02-12 02:35:58

标签: ios swift segue alamofire

我有两个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函数完成之前运行。我想知道我能做些什么来确保classChooseViewControllerprepareForSegue函数运行完成之前不会加载。

以下是classChooseViewController

的代码
class classChooseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var classNameArray: NSArray = []
    override func viewDidLoad() {
        super.viewDidLoad()
        print(classNameArray)
    }
}

我附上了控制台读取内容的图片。您可以在classNameArray函数之前看到classChooseViewController viewDidLoad()函数打印prepareForSegue(),因为" ---"之后打印出来。

Console Printout Screenshot

1 个答案:

答案 0 :(得分:1)

你的设计错了。

Alamofire request函数是异步的。它会在结果准备好之前立即返回。然后它调用您传入的完成处理程序。

我倾向于同意Paul的意见,你应该在目标视图控制器中而不是在当前视图控制器中发出请求。

如果您想要在切换到另一个视图控制器之前获取Alamofire中的数据,那么您需要编写一个启动请求的方法,然后从{{1}调用segue到另一个视图控制器} call的完成处理程序。

如果您从按下按钮调用新视图控制器,则不需要将按钮直接链接到segue,而是编写一个触发AlamoFire请求调用的IBAction方法,然后调用segue(或实例化直接查看控制器并从完成处理程序手动推送/显示它。

这样的事情:

Alamofire.request()

顺便说一下,类名和类型应该以大写字母开头,变量名应该以小写字母开头。这是Swift和Objective-C中非常强大的约定,除非你遵循惯例,否则你会混淆其他iOS / Mac开发人员。