为什么我的数组数组没有返回任何东西?

为什么我的数组数组没有返回任何东西?

问题描述:

我不能解决为什么我的数组(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

这里是展示你的代码的相关部分切下来的版本:

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

所以你创建任务,并启动它,然后立即打印amountArray。了解该任务将异步运行非常重要,也就是说,它将定期获得处理时间,直到完成为止,但在任务甚至真正开始之前,您的代码的执行将继续从task.resume()继续。因此,您的print()在将数据添加到amountArray的代码发生之前很久才执行。

如果要查看self.amountArray中的内容,请移动print()语句,以便它是任务完成模块中发生的最后一件事。然后在之后发生改变。