Как заставить uicollectionview перезагрузиться, как только он получит данные от firebase?

Я хотел бы сделать перезагрузку UI collectionView после того, как он получил данные из firebase. Сейчас он работает только вручную, когда я нажимаю кнопку обновления.

class MedalsViewController: UICollectionViewController {

    var imagesArray = [String]()
    var identities = [String]()
    var identities2 = [String]() //Creates an empty array
    var imagesArrayGreyed = [String]()
    var identities3 = [String]()
    let databaseRef = FIRDatabase.database().reference()
    let userID = FIRAuth.auth()?.currentUser?.uid

    override func viewDidLoad() {
        super.viewDidLoad()


        let userID = FIRAuth.auth()?.currentUser?.uid
        let databaseRef = FIRDatabase.database().reference()
        databaseRef.child("users").child(userID!).child("medals").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
            // Get user medals
            self.identities3 = snapshot.value as! [String]
            print (self.identities3)
        })


        imagesArray = ["1", "2", "3"] //Add all the medal images here
        identities = ["Shield", "Tie", "Star"] //Add all the identities here
        identities2 = ["Shield", "Tie"] //Choose what medals the user has.
        imagesArrayGreyed = ["1Greyed","2Greyed","3Greyed"] //Add all the greyed images here

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(animated: Bool) {

        self.tabBarController?.tabBar.hidden = false
        // Attempt at getting medals array from firebase database

    }



    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) 

        let imageView = cell.viewWithTag(1) as! UIImageView

        // Identites2 is the medals you currently own, so it'll check back to see if you own the medal and if not a question mark will be displayed. 
        // Time to check to see if it can update in real time. Check out firebase and try to link it here
        // Also see if can add a progress bar to only show for those greyed out medals 


        // Get ready to edit this to identities3 which is directly taken from firebase database
        if (identities3.contains(identities[indexPath.row])) {
            imageView.image = UIImage(named: imagesArray[indexPath.row])

        }
        else {
            imageView.image = UIImage(named: imagesArrayGreyed[indexPath.row]) //Set default image not in identities2
        }

        return cell

    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imagesArray.count
    }

    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        let vc = identities[indexPath.row]
        let viewController = storyboard?.instantiateViewControllerWithIdentifier(vc)
        self.navigationController?.pushViewController(viewController!, animated: true)
        viewController?.title = self.identities[indexPath.row]
    }


    // Send a fake medal from the array of identities2
    @IBAction func sendFakeMedalandReload(sender: UIBarButtonItem) {
        let databaseRef = FIRDatabase.database().reference()
        databaseRef.child("users/\(FIRAuth.auth()!.currentUser!.uid)/medals").setValue(identities2)
        self.collectionView!.reloadData()
    }
}

Этот код в основном отображает медали, которые есть у пользователя, сравнивая два массива (тождества и тождества3), чтобы убедиться, что они подсчитывают, если нет, то они затеняют изображения тождеств, не содержащиеся в массиве (identity3)

Данные поступают в viewDidLoad в виде данных снимка с firebase. Я намерен сделать так, чтобы collectionView перезагружался каждый раз, когда вызывается viewWillAppear.

Я попытался вызвать self.collectionView! .ReloadData () в viewDidLoad и viewDidAppear, но безрезультатно. Я подозреваю, что это может быть задержка, в которой данные получены, что приводит к загрузке пустого массива (identity3).

Ответы на вопрос(1)

Ваш ответ на вопрос