2015-04-07 58 views
2
var arrayLength:Int = 0 // is equal to 0 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let urlPath = "http://example.com/json" 

    let url = NSURL(string: urlPath)! 
    let session = NSURLSession.sharedSession() 

    let task = session.dataTaskWithURL(url, completionHandler: { 
     data, response, error in 

     if (error? != nil) { 
      println(error) 
     } else { 
      var jsonResponse: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) 

      let json = JSON(jsonResponse!) 
      self.arrayLength = json["dump"].array?.count as Int! 
      println("Second: \(self.arrayLength)") // is equal to 3 

      for postIndex in 0...self.arrayLength-1 { 
       println(json["dump"][postIndex]["title"]) 
      } 
     } 

    }) 
    task.resume() 

    println(arrayLength) // is equal to 0 again 

的我的代碼開始設置變量不發生變化外封

var arrayLength:Int = 0 

。稍後在viewDidLoad()內部,我將其更改爲3.當我調用它時,在任務塊之外再次將它等於0.此處存在什麼問題以及我做錯了什麼?

+0

您在完成異步任務之前正在打印它。換句話說,下載開始,但沒有完成 –

回答

2

是的,你正在更改你的閉包中的arrayLength var。您正在面對的問題這只是線程工作的常規方式。

  1. viewDidLoad開始你在主線程
  2. let task = session.dataTaskWithURL(url, completionHandler: { ...定義了一個新的任務,那就是尚未執行
  3. task.resume()啓動另一個線程此任務。這需要一段時間才能完成。當它完成後您的arrayLength將立即改變
  4. 你問主線程爲您arrayLength

這裏:

 println(arrayLength) // is equal to 0 again 

這並不是說arrayLength等於0 再次 ,你沒有給你足夠的時間來執行和改變這個值。

編輯:如果你需要檢查arrayLength關閉後結束...

只需創建一個函數,並調用它最後一件事,你的封內。像這樣:

override func viewDidLoad() { 
    ... 

    let task = session.dataTaskWithURL(url, completionHandler: { 
     data, response, error in 

     if (error? != nil) { 
      println(error) 
     } else { 
      var jsonResponse: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) 

      let json = JSON(jsonResponse!) 
      self.arrayLength = json["dump"].array?.count as Int! 
      println("Second: \(self.arrayLength)") // is equal to 3 

      for postIndex in 0...self.arrayLength-1 { 
       println(json["dump"][postIndex]["title"]) 
      } 

      functionToDoSomethingAtTheEndOfTheClosure(); 
     } 

    }) 
    task.resume() 
} 

func functionToDoSomethingAtTheEndOfTheClosure() { 
    // this is going to be executed at the end of the closure's code 
} 
+0

感謝您的描述!那麼,我該怎麼做,它會在任務過程之後立即打印出來?我必須關閉異步或其他方式在這裏? –

+1

在完成塊本身中調用相關的代碼行。 –

+0

@NeilHorton,但我想叫它在這個區塊之外 –

相關問題