func getLocationOfItem(textFieldText: (String)) -> String
правильно возвращает location
с начальным значением "".
Проблема, с которой вы сталкиваетесь, заключается в том, что вы вызываете асинхронную задачу из firebase внутри функции синхронизацииcall.
Вы можете реорганизовать вызов метода для асинхронного возврата требуемой строки, сделав следующие изменения:
func getLocationOfItem(textFieldText: String, completion: @escaping (_ itemLocation: String?) -> Void){
let itemLet = addedItems()
Database.database().reference().child("item").observe(.childAdded, with: { (snapshot) in
guard let dictionary = snapshot.value as? [String: AnyObject] else {
return completion(nil)
}
itemLet.itemName = dictionary["itemName"] as? String
itemLet.itemLocation = dictionary["itemLocation"] as? String
itemLet.itemImageUrl = dictionary["itemImageUrl"] as? String
itemLet.itemTS = dictionary["itemTS"] as? String
itemLet.id = dictionary["id"] as? String
if(textFieldText == itemLet.itemName){
completion(itemLet.itemLocation)
} else {
completion(nil)
}
}, withCancel: nil)
}
/// Usage
@IBAction func getLocation(_ sender: UIButton) {
guard let itemNameInLocation = itemNameInLctn.text else { return }
getLocationOfItem(textFieldText: itemNameInLocation) { [weak self] (itemLocation) in
self?.strLocation = itemLocation
self?.itemLocationLbl.text = itemLocation
}
}
Примечание:
Обратите внимание, что завершениеОбработчик будет вызываться каждый раз, когда значение добавляется по пути item
в вашей базе данных Firebase. В этом случае я настоятельно рекомендую проводить рефакторинг для использования observeSingleEvent
, предоставляемого Firebase.
Пожалуйста, смотрите ссылкуниже для документации об указанном методе:
https://firebase.google.com/docs/database/ios/read-and-write#read_data_once
Если это было ваше намерение, то это лучший выбор.