2017-02-12 16 views
-1

私に問題を引き起こしている2つのviewControllerがあります。 1つはnotificationAccessViewController.swiftと呼ばれ、もう1つはclassChooseViewController.swiftと呼ばれます。私はnotificationAccessViewControllerのボタンを持って、classChooseViewControllerのセグをトリガーします。私がする必要があるのは、prepareForSegue関数の中にあり、Alamofire要求を実行してから、応答をclassChooseViewControllerに渡します。それは動作します!しかし、十分に速くはありません。以下はprepareforsegueのAlamofireリクエストが終了するチャンスがある前に、viewDidLoad()が実行されています

私はそれはそれに成功し、コンソールにclassNameArrayをプリントアウトしている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 
     } 
    } 
} 

以内に私prepareForSegue機能です。私のclassChooseViewController.swiftでは、コンソールにclassNameArrayも印刷していますが、その内部には何も印刷されません。これは、prepareForSegue機能が終了する前にclassChooseViewController.swiftviewDidLoad()機能が実行されているためです。 prepareForSegue機能の実行が完了するまで、classChooseViewControllerがロードされないようにするためにできることを知りたいと思います。

以下は、私はコンソールが読み込ま何の写真を添付し​​ているclassChooseViewController

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

のために私のコードです。 classNameArrayclassChooseViewControllerviewDidLoad()ファンクションがprepareForSegue()ファンクションの前に印刷されていることがわかります。「---」が後で印刷されるからです。

Console Printout Screenshot

+0

送信元ではなく宛先ビューコントローラでデータをロードする必要があります。 – Paulw11

+0

@ Paulw11それは私が元々セットアップしたものです。けれども、「classChooseViewControllerに、私は私がAlamofire要求から取得し、アレイからのデータを取り込む必要があるのUITableViewを持っています。ビューコントローラでリクエストを実行すると、UITableViewが既にロードされており、alamofireリクエストから取得した配列を使用できません。 –

+0

はい、できます。データがロードされていること、スピナーまたは「ロード中の」セルが表示されていることをユーザーに表示し、データを取得したらテーブルをリロードする必要があります。 – Paulw11

答えて

1

あなたのデザインが間違っています。

Alamofire request関数は非同期です。結果が出る前にすぐに戻ります。

現在のビューコントローラではなく、宛先ビューコントローラで要求を行う必要があるという点で、私はPaulに同意する傾向があります。

Alamofireでデータをフェッチしてから別のView Controllerにセグメントする場合は、要求を開始するメソッドを記述してから、Alamofire.request()コールの完了から別のView Controllerにセグを呼び出す必要がありますハンドラ。

ボタン・プレスから新しいビュー・コントローラーを呼び出す場合、ボタンをセグに直接リンクするのではなく、代わりに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

は、私が行方不明閉じ括弧以外の何もないし、エラーを発見しました。しかし、修正した後でさえ、2つの他のエラーが残っています。 ?のように:ライン 'classChooseViewController =ストーリーボード.instantiateViewController( "ClassChooseViewController" withIdentifierを)聞かせて上の一つ! classChooseViewController' エラーは暗黙的に 'self'の使用を読み取ります。自己を使用する。キャプチャセマンティクスを明示的にする –

+1

スタックオーバフローエディタでそのコードをタイプアウトしました。ほぼ確実に複数の構文エラーがあります。あなたのコードにコピーして貼り付けることは意図されていませんでした。それはガイドとしてのみ意味されていた。 –

関連する問題