Показаны всплывающее окно Async - PullRequest
0 голосов
/ 25 августа 2018

Я хочу, чтобы предупреждение отображалось в соответствии с асинхронной логикой.

Это мой код:

@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)

        })

    }

Что делает этот фрагмент кода:

  1. Проверить, был ли продукт сохранен в избранном
  2. Если есть, показать всплывающее окно A
  3. Если нет, показать всплывающее окно B

Я последовал за другим сообщением в StackOverflow, в котором говорилось, что именно так я должен был вызывать асинхронную функцию. ( Может ли Swift возвращать значение из асинхронного блока, возвращающего пустоту? )

На самом деле происходит только то, что отображается только всплывающее окно B (то, что находится за пределами IsItemInFavoritesAsync) В чем моя ошибка?

Полагаю, что IsItemInFavoritesAsync входит в замыкание по окончании, а функция IsItemInFavoritesAsync продолжается до раздела "Товар отсутствует в дереве".

Примечание: функция IsItemInFavoritesAsync читает из Firebase.

Как мне это исправить?

1 Ответ

0 голосов
/ 25 августа 2018

Оба действия (положительный результат и отрицательный результат) должны быть внутри обработчика завершения.

Так что-то вроде этого:

IsItemInFavoritesAsync(productId: productToDisplay.UniqueID()) { success in
    if success {
      // Product exists in favorite tree
      Constants.showAlert(title: "Item in Tree", message: "Yes it is", timeShowing: 1, callingUIViewController: self)
    }
    else {
      // 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)
    }
}
...