Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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
Ios viewDidLoad()在prepareforsegue中的Alamofire请求有机会完成之前运行_Ios_Swift_Segue_Alamofire - Fatal编程技术网

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

Ios viewDidLoad()在prepareforsegue中的Alamofire请求有机会完成之前运行,ios,swift,segue,alamofire,Ios,Swift,Segue,Alamofire,我有两个ViewController,这给我带来了麻烦。一个名为notificationAccessViewController.swift,另一个名为classChooseViewController.swift。我在notificationAccessViewController中有一个按钮,它触发到classChooseViewController的序列。我需要做的是在prepareForSegue函数中,执行Alamofire请求,然后将响应传递给classChooseViewContr

我有两个ViewController,这给我带来了麻烦。一个名为
notificationAccessViewController.swift
,另一个名为
classChooseViewController.swift
。我在
notificationAccessViewController
中有一个按钮,它触发到
classChooseViewController
的序列。我需要做的是在
prepareForSegue
函数中,执行
Alamofire
请求,然后将响应传递给
classChooseViewController
。真管用!但是,还不够快

下面是我的
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
        }
    }
}
class classChooseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var classNameArray: NSArray = []
    override func viewDidLoad() {
        super.viewDidLoad()
        print(classNameArray)
    }
}
我让它将
classNameArray
打印到控制台,它成功地做到了这一点。尽管如此,在我的
classChooseViewController.swift
中,我也将
classNameArray
打印到控制台上,但它打印时没有任何内容。这是因为
classChooseViewController.swift的
viewDidLoad()
函数在
prepareforsgue
函数完成之前正在运行。我想知道我能做些什么来确保
classChooseViewController
prepareForSegue
函数完成运行之前不会加载

下面是我的
classChooseViewController

    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
        }
    }
}
class classChooseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var classNameArray: NSArray = []
    override func viewDidLoad() {
        super.viewDidLoad()
        print(classNameArray)
    }
}
我附上了一张控制台显示内容的图片。您可以看到
classNameArray
classChooseViewController
s
viewDidLoad()
函数在
prepareforsgue()
函数之前打印,因为“--”在之后打印

你的设计是错误的

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

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

如果您确实希望在切换到另一个视图控制器之前获取Alamofire中的数据,那么您需要编写一个方法来启动请求,然后从
Alamofire.request()
调用的完成处理程序调用到另一个视图控制器的segue

如果您是通过按下按钮来调用新的视图控制器,则不需要将按钮直接链接到segue,而是编写一个iAction方法来触发AlamoFire请求调用,然后从完成处理程序调用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开发人员搞糊涂

您应该在目标视图控制器中加载数据,而不是在源视图控制器中加载数据。@w11这是我最初设置的。尽管如此,在“classChooseViewController”中,我有一个UITableView,我需要用从Alamofire请求获得的数组中的数据填充它。当我在视图控制器中执行请求时,UITableView已经加载,我无法使用从alamofire请求中获取的数组来填充它。是的,您可以。您应该向用户显示一些正在加载数据的指示、微调器或“加载”单元格,然后在获得数据后重新加载表。您是否建议我默认隐藏UITableView,显示加载指示器(微调器),然后在数据准备就绪后再次显示UITableView?是。这是一种方法。我使用的另一种方法是,如果源数组为空,则在表中使用单个单元格“加载”或类似方法。请向您寻求帮助。我试着实现这个IBAction方法;虽然我有一些错误@邓肯奇发现这个错误只不过是缺少了一个右括号。尽管如此,即使在修复了这两个错误之后,仍然存在其他两个错误。一个在
行中,让classChooseViewController=storyboard?。实例化eviewcontroller(标识符为:“classChooseViewController”)为!classChooseViewController
错误读取“self”的隐式用法。使用self。为了明确捕获语义,我在堆栈溢出编辑器中键入了该代码。它几乎肯定有多个语法错误。它并不打算复制并粘贴到代码中。这只是一个指南,看看你是否能自己纠正“隐性使用自我”的错误。如果你仔细观察,Xcode会告诉你如何修复它。邓肯,我能够修复这两个“隐式使用自我”错误。虽然,当我点击按钮触发iAction时,我得到了一个“thread1:SIGABRT信号”错误,并且视图没有改变。要使presentViewController()函数正常工作,是否需要在两个ViewController之间进行分段?