Загрузка изображения из Firebase и добавление его в массив - PullRequest
0 голосов
/ 17 декабря 2018

По сути, я получил массив, включающий все данные, необходимые для моей ячейки прототипа.Я получаю эти данные (изображение, название и бренд) из Firebase.Теперь я создал цикл для извлечения всего из базы данных, но теперь моя проблема в том, что я не могу добавить «изображение» в мой метод «tempShopCells.append ()», потому что он находится внутри этого цикла и недоступен.Код:

func createArray(completion: @escaping ([ShopCell]) -> () ) {
    var tempShopCells: [ShopCell] = []
    let rootRef = Database.database().reference()
    let query = rootRef.child("tobacco").queryOrdered(byChild: "name")
    query.observeSingleEvent(of: .value) { (snapshot) in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let value = child.value as? [String: Any];
            let name = value?["name"] as? String ?? "";
            let brand = value?["brand"] as? String ?? "";
            let iD = value?["iD"] as? String ?? "";
            let imageReference = Storage.storage().reference().child("tobaccoPictures").child("\(iD).jpg")
            imageReference.getData(maxSize: (1 * 1024 * 1024)) { (data, error) in
                if let _error = error{
                    print(_error)
                } else {
                    if let _data  = data {
                        let image: UIImage! = UIImage(data: _data)
                    }
                }
            }
            tempShopCells.append(ShopCell(productName: name, brandName: brand, productImage: image))
        }
        completion(tempShopCells)
    }

1 Ответ

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

Переместите строку, где вы добавляете новый элемент в массив сразу после инициализации изображения из _data

if let _data = data {
     let image: UIImage! = UIImage(data: _data)
     tempShopCells.append(ShopCell(productName: name, brandName: brand, productImage: image))
}

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

Поэтому я бы порекомендовал вам использовать DispatchGroup.

Сначала создайте новый DispatchGroup.Затем, прежде чем запрашивать данные изображения, введите - dispatchGroup, а после получения данных оставьте dispatchGroup.Когда будут получены данные каждого изображения, позвоните completion при закрытии dispatchGroup.notify(queue:)

let dispatchGroup = DispatchGroup()

for child in snapshot.children.allObjects as! [DataSnapshot] {
    ...
    dispatchGroup.enter()
    imageReference.getData(maxSize: (1 * 1024 * 1024)) { (data, error) in
        ... // error, appending to array, etc.
        dispatchGroup.leave()
    }    
}
dispatchGroup.notify(queue: .main) {
    completion(tempShopCells)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...