Как вы гарантируете, что одна часть быстрой функции будет завершена раньше, чем другая часть функции?
Итак, что делает это сложным, так это то, что часть B не является недействительной (то есть возвращаемой). Это затрудняет (и пока безуспешно - я пытался) использовать Defer или Dispatch Groups.
Функция
Эта функция вызывается при длительном нажатии. Это стандартный быстрый contextMenuInteraction. Обычно при длительном нажатии выполняется вызов базы данных, чтобы проверить, имеет ли что-то в базе данных значение 0 или 1. В зависимости от результата возвращается 1 из 2 других изображений VC.
Почему я не могу просто представить изображение внутри вызова части A db?
Это не сработает, потому что contextMenuInteraction находится в классе UITableViewCell. Я мог бы использовать делегат, но это невозможно, потому что ячейка в VC занимает весь экран. Поэтому, если я выступаю с делегатом, он занимает весь экран. Я уже пробовал это.
Что должно произойти ?:
При долгом нажатии вызывается contextMenuInteraction. Внутри него часть A, которая проверяет DB, должна запускаться перед частью B, которая возвращает изображение VC на основе вызова Db.
func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
UIContextMenuConfiguration(identifier: nil, previewProvider: { [self] in
func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
UIContextMenuConfiguration(identifier: nil, previewProvider: { [self] in
//part a
if self.postID != nil {
let r1 = Database.database().reference().child("switch").child(self.postID).child("switch")
r1.observeSingleEvent(of:.value, with: { [self]snapshot in
if snapshot.exists() {
print("Got data \(snapshot.value!)") //will print true or false
let ab = snapshot.value!
if ab as! Int>0 {
f = false
print("true1")
} else {
print("true2")
r = false
}
}
else {
print("No data available")
}
})
}
print("dam")
print("dam1")
//part b
if self.dd == interaction {
if let unwrappedImage = self.immy.image {
return ImagePreviewController(image:unwrappedImage)
}
else {
return nil
}
// put dd stuff here
}
else if self.f == false {
let image3 = UIImage(named:"ringy.png")
if let unwrappedImage1 = image3 {
return ImagePreviewController(image:unwrappedImage1)
}
else {
return nil
}
// put dd stuff here
}
else if self.r == false {
// put cc stuff here
let image3 = UIImage(named:"green.png")
if let unwrappedImage1 = image3 {
return ImagePreviewController(image:unwrappedImage1)
}
else {
return nil
}
}
return nil
})
}
Последнее замечание: вы можете пойти в обратном направлении с установкой и тестированием истинной iso, как и я здесь. Значение по умолчанию истинно для обоих в override func прямо сейчас.