Я хочу, чтобы предупреждение отображалось в соответствии с асинхронной логикой.
Это мой код:
@IBAction func AddToFavoriteButton(_ sender: Any)
{
IsItemInFavoritesAsync(productId: productToDisplay.UniqueID())
{
success in
// Product exists in favorite tree
Constants.showAlert(title: "Item in Tree", message: "Yes it is", timeShowing: 1, callingUIViewController: self)
}
// Product doesn't exist in favorite tree
Constants.showAlert(title: "Item NOT in Tree", message: "Isn't", timeShowing: 1, callingUIViewController: self)
Product.RegisterProductOnDatabaseAsFavorite(prodToRegister: productToDisplay, productType: productType)
}
private func IsItemInFavoritesAsync(productId: String, completionHandler: @escaping (Bool) -> ())
{
let favoriteTree = productType == Constants.PRODUCT_TYPE_SALE ? Constants.FAVORITE_TREE_SALE : Constants.FAVORITE_TREE_PURCHASE
Constants.refs.databaseRoot.child(favoriteTree).child((Constants.refs.currentUserInformation!.uid)).observeSingleEvent(of: .value, with: {(DataSnapshot) in
return DataSnapshot.hasChild(self.productToDisplay.UniqueID()) ? completionHandler(true) : completionHandler(false)
})
}
Что делает этот фрагмент кода:
- Проверить, был ли продукт сохранен в избранном
- Если есть, показать всплывающее окно A
- Если нет, показать всплывающее окно B
Я последовал за другим сообщением в StackOverflow, в котором говорилось, что именно так я должен был вызывать асинхронную функцию. ( Может ли Swift возвращать значение из асинхронного блока, возвращающего пустоту? )
На самом деле происходит только то, что отображается только всплывающее окно B (то, что находится за пределами IsItemInFavoritesAsync
) В чем моя ошибка?
Полагаю, что IsItemInFavoritesAsync
входит в замыкание по окончании, а функция IsItemInFavoritesAsync
продолжается до раздела "Товар отсутствует в дереве".
Примечание: функция IsItemInFavoritesAsync
читает из Firebase.
Как мне это исправить?