2017-02-12 49 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

我在堆棧溢出編輯器中輸入了該代碼。它幾乎肯定有多個語法錯誤。它並不打算複製並粘貼到您的代碼中。這只是作爲指導。 –

相關問題