Ios 为什么我的amount数组没有返回任何内容?

Ios 为什么我的amount数组没有返回任何内容?,ios,json,swift,for-loop,dispatch,Ios,Json,Swift,For Loop,Dispatch,如果我在forloop之后打印数组(amoundarray、interestArray和riskbandArray),我无法理解为什么我的数组(amoundarray、interestArray和riskbandArray)会返回完整的信息集,而如果我在viewDidload方法的末尾打印数组,则不会返回任何信息。我知道这可能是因为网络请求是在后台执行的,所以当我要求打印数组时,没有返回任何内容,因为它是在主线程中调用的。我试图通过引入Grand Central Dispatch来抵消这一点,但

如果我在forloop之后打印数组(amoundarray、interestArray和riskbandArray),我无法理解为什么我的数组(amoundarray、interestArray和riskbandArray)会返回完整的信息集,而如果我在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)
}

下面是一个精简版本,显示了代码的相关部分:

let task: NSURLSessionDownloadTask = session.downloadTaskWithURL(Url!) {...}
task.resume()
print(self.amountArray)
因此,您正在创建一个任务并启动它,然后立即打印
amountArray
。重要的是要知道任务将异步运行,也就是说,它将定期获得处理时间,直到完成为止,但在任务真正开始之前,代码将从
任务继续执行。resume()
。因此,您的
print()
在将数据添加到
amountArray
的代码出现之前很久就会执行


如果要查看
self.amountArray
中的内容,请移动
print()
语句,使其成为任务完成块中发生的最后一件事。更改阵列后将发生这种情况。

下面是一个精简版本,显示了代码的相关部分:

let task: NSURLSessionDownloadTask = session.downloadTaskWithURL(Url!) {...}
task.resume()
print(self.amountArray)
因此,您正在创建一个任务并启动它,然后立即打印
amountArray
。重要的是要知道任务将异步运行,也就是说,它将定期获得处理时间,直到完成为止,但在任务真正开始之前,代码将从
任务继续执行。resume()
。因此,您的
print()
在将数据添加到
amountArray
的代码出现之前很久就会执行


如果要查看
self.amountArray
中的内容,请移动
print()
语句,使其成为任务完成块中发生的最后一件事。更改阵列后会发生这种情况。

就像您前面的问题一样:您的任务是异步的,因此在打印阵列时没有完成。没有办法更改吗?我不确定这是否可能,但这肯定是个坏主意。而是根据数组将逻辑移到任务的完成块中。如果您在那里打印阵列,您将看到它工作得非常完美。只需将
print(self.amountArray)
放在
self.collectionView?.reloadData()
。就像您前面的问题一样:您的任务是异步的,因此,打印阵列时未完成。没有办法更改吗?我不确定这是否可能,但这肯定是个坏主意。而是根据数组将逻辑移到任务的完成块中。如果您在那里打印阵列,您将看到它运行得非常好。只需将
print(self.amountArray)
放在
self.collectionView?.reloadData()之前即可。