2017-02-12 77 views
-1

我有两个viewController给我带来麻烦。一个叫notificationAccessViewController.swift,另一个叫classChooseViewController.swift。我在notificationAccessViewController中有一个按钮,触发了一个跳转到classChooseViewController。我需要做的是在prepareForSegue函数中,执行Alamofire请求,然后将响应传递给classChooseViewController。这样可行!但是,速度不够快。viewDidLoad()在prepareforsegue的Alamofire请求有机会完成之前运行

下面是我的内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到控制台,它就会成功地做prepareForSegue功能。虽然在我的classChooseViewController.swift中,我还打印出classNameArray到控制台,它没有任何内容打印。这是因为classChooseViewController.swiftviewDidLoad()函数在prepareForSegue函数完成之前正在运行。我想知道我能做些什么来确保classChooseViewController不会加载,直到prepareForSegue函数完成运行。

下面是我的代码classChooseViewController

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

我重视的控制台读取内容拍摄成照片。您可以看到,在prepareForSegue()函数之前,classNameArray打印来自classChooseViewControllerviewDidLoad()函数,因为之后打印出“---”。

Console Printout Screenshot

+0

您应该将数据加载到目标视图控制器中,而不是源代码中。 – Paulw11

+0

@ Paulw11这是我最初设置的。尽管在'classChooseViewController中,我有一个UITableView,我需要用来自Alamofire请求的数组中的数据来填充它。当我在视图控制器中执行请求时,UITableView已经加载,我不能使用从alamofire请求获得的数组来填充它。 –

+0

是的,你可以。您应该向用户显示一些数据正在加载的指示,一个微调器或“加载”单元,然后在您拥有数据后重新加载表格。 – Paulw11

回答

1

你的设计是错误的。

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

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

如果您想要在Alamofire中获取数据,然后再继续使用其他视图控制器,那么您需要编写一个启动请求的方法,然后从Alamofire.request()调用的完成中调用其他视图控制器的继续处理程序。

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

事情是这样的:

@IBAction buttonAction(sender: UIButton) { 
    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) 
     let theClassChooseViewController = storyboard.instantiateViewController(withIdentifier:"ClassChooseViewController" as ClassChooseViewController 
     theClassChooseViewController.classNameArray = classNameArray 
     presentViewController(theClassChooseViewController, 
      animated: true, 
      completion: nil) 
    } 
    } 
} 

顺便说一句,类名和类型应以大写字母开头,和变量名应该以小写字母开头。在Swift和Objective-C中这是一个非常强大的约定,除非遵循约定,否则你会将其他iOS/Mac开发者混为一谈。

+0

感谢您的帮助。我尝试使用这种IBAction方法;尽管我收到了一些错误。 [链接](http://imgur.com/a/ZaxKX) @DuncanC –

+0

,我发现了错误只不过是一个缺少近距离括号更多。虽然,即使在修复之后仍然存在两个其他错误。一上线 '让classChooseViewController =故事板.instantiateViewController(withIdentifier: “ClassChooseViewController”)?作为! classChooseViewController' 该错误读取隐式使用'self'。使用自我。明确捕获语义 –

+1

我在堆栈溢出编辑器中输入了该代码。它几乎肯定有多个语法错误。它并不打算复制并粘贴到您的代码中。这只是作为指导。 –

相关问题