2015-11-07 3 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() так, чтобы это было последним, что происходит в блоке завершения задачи. Затем произойдет после массив изменен.