2015-11-07 142 views
1

我不能解決爲什麼我的數組(amountArray,interestArray和riskbandArray)返回全部信息,如果我剛剛在forloop後打印它們,而如果我在viewDidload方法的最後打印它們,它將不會返回任何內容。我知道它可能發生,因爲網絡請求正在後臺執行,所以當我要求打印我的數組時,由於它在主線程中被調用,因此沒有返回結果。我試圖通過引入Grand Central Dispatch來抵消這一點,但我的陣列仍然是空的。所以令人沮喪。爲什麼我的數組數組沒有返回任何東西?

class CollectionViewController: UICollectionViewController { 

var amountArray = [Int]() 
var interestArray = [Double]() 
var riskbandArray = [String]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let session = NSURLSession.sharedSession() 
    let Url = NSURL(string: "http://fc-ios-test.herokuapp.com/auctions") 
    let task: NSURLSessionDownloadTask = session.downloadTaskWithURL(Url!) { (url, response, error) -> Void in 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

     let data = NSData(contentsOfURL: url!) 
     do { 
      let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary 

      if let array = jsonData["items"] as? [[NSObject:AnyObject]] { 

       for item in array { 
        self.amountArray.append(item["amount_cents"] as! Int) 
        self.interestArray.append(item["rate"] as! Double * 100) 
        self.riskbandArray.append(item["risk_band"] as! String) 

       } 

      } 
      self.collectionView?.reloadData() 

     } catch { 
      print(error) 
     } 

     }) 

    } 
    task.resume() 


    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Register cell classes 
    self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) 

    // Do any additional setup after loading the view. 



    print(self.amountArray) 
} 
+2

像你以前的問題:你的任務是異步的,因此在打印數組時不會完成。 – luk2302

+0

有沒有辦法改變? –

+0

我不知道這是否可能,這肯定是一個壞主意。而是根據數組將邏輯移動到任務的完成塊中。如果您打印陣列,您會看到它完美地工作。 – luk2302

回答

0

這裏是展示你的代碼的相關部分切下來的版本:

let task: NSURLSessionDownloadTask = session.downloadTaskWithURL(Url!) {...} 
task.resume() 
print(self.amountArray) 

所以你創建任務,並啓動它,然後立即打印amountArray。瞭解該任務將異步運行非常重要,也就是說,它將定期獲得處理時間,直到完成爲止,但在任務甚至真正開始之前,您的代碼的執行將繼續從task.resume()繼續。因此,您的print()在將數據添加到amountArray的代碼發生之前很久才執行。

如果要查看self.amountArray中的內容,請移動print()語句,以便它是任務完成模塊中發生的最後一件事。然後在之後發生改變。

相關問題