【发布时间】:2015-11-07 18:27:43
【问题描述】:
如果我在 forloop 之后打印它们,我无法弄清楚为什么我的数组(amountArray、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)
}
【问题讨论】:
-
就像您之前的问题一样:您的任务是异步的,因此在您打印数组时未完成。
-
没有办法改变吗?
-
我不确定这是否可行,但这肯定是个坏主意。而是将取决于数组的逻辑移动到任务的完成块中。如果你在那里打印数组,你会发现它一切正常。
-
只需将
print(self.amountArray)放在self.collectionView?.reloadData()之前。
标签: ios json swift for-loop dispatch