У меня есть неожиданное не пустое возвращаемое значение в ошибке void функции? - PullRequest
0 голосов
/ 25 декабря 2018
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    switch section {
    case 0:

переопределение оператора var

        one = Database.database().reference()

сбор информации из базы данных

        one.child("users").child("profile").observe(.value, with: {(snapshot) in
            let num = snapshot.childrenCount

, где возникает ошибка

            return Int(num)
        })
    default:
        return 0
    }

}

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Дуг Стивенсон прав!

Вместо этого вы можете получить данные с сервера, проанализировать их, сохранить в переменной и обновить свой collectionView.

var data = [YourModel]()

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

Database.database().reference().child("users").child("profile").observe(.value, with: {(snapshot) in

    let values = snapshot.values as? [String: Any] else { return }

    var tmpArrayOfValues = [YourModel]()

    // here you create YourModel objects
    values.forEach { (item) in
        let newItem = //create your item from values
        tmpArrayOfValues.append(newItem)
    }    

    self.data = tmpArrayOfValues

    // to update UI you have to return to main thread, because firebase func are running on background thread
    DispatchQueue.main.async {
        self.collectionView.reloadData()
    }
}
0 голосов
/ 25 декабря 2018

Эта функция, которую вы передаете для наблюдения, напечатана как функция, которая возвращает void:

{(snapshot) in
    let num = snapshot.childrenCount
    return Int(num)
})

Вы можете видеть из документов API для наблюдения :

Декларация

func observe(_ eventType: DataEventType, with block: @escaping (DataSnapshot) -> Void) -> UInt

Тип функции - (DataSnapshot) -> Void, что означает, что она не может возвращать значение.Но вместо этого вы возвращаете Int(num).

Вы не сможете вернуть результат запроса к базе данных из collectionView (), поскольку наблюдатель базы данных является асинхронным и немедленно возвращается.Это даст вам значение через некоторое время, и у вас нет гарантии, сколько времени это займет.

...