【问题标题】:Why is my amount array not returning anything?为什么我的数量数组没有返回任何内容?
【发布时间】: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


【解决方案1】:

以下是显示代码相关部分的精简版:

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

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

如果您想查看self.amountArray 中的内容,请移动print() 语句,使其成为任务完成块中发生的最后一件事。然后它会在数组更改之后发生

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多