Я передаю String (postID) между двумя контроллерами представления (соответственно DiscoverV C и DetailV C), используя параметр отправителя метода executeSegue . Когда представлен пункт назначения V C, я фактически вижу, что переданная мной строка правильно назначена локальной переменной «postID» (поскольку я могу ее распечатать). Но когда я пытаюсь выполнить над ним какие-либо операции, такие как запросы в базе данных Firebase, создается впечатление, что строка больше не присутствует. Я не знаю, как решить эту проблему, хотя это кажется глупым.
Это код метода viewDidLoad () получателя V C
var postID = “”
override func viewDidLoad() {
print("this is the postID that I get from previous VC \(postID)")
super.viewDidLoad()
updateViewDetail()
}
This это метод updateViewDetail (), который выполняет некоторые операции с базой данных Firebase. Он пытается получить сообщение, используя строку PostID.
func updateViewDetail(){
Api.Post.observePost(with: postID) { (post) in
print("post id inside \(post.id)")
guard let postUid = post.uid else{
return
}
self.fetchUsers(uid: postUid) {
self.post = post
self.tableView.reloadData()
}
}
}
Когда я пытаюсь напечатать post.id внутри замыкания, он равен нулю. Вы знаете, как я могу решить эту проблему? Просто для завершения, это код метода наблюдений, который извлекает объект записи из базы данных FIR:
func observePost(with id : String, completion: @escaping (Post)-> Void) {
REF_Posts.child(id).observeSingleEvent(of: .value) { (snaphsot) in
if let dict = snaphsot.value as? [String : Any]{
let post = Post.transformPost(dict: dict, key: snaphsot.key)
completion(post)
}
}
}
РЕДАКТИРОВАТЬ 1:
Это код prepare
метод, установленный в предыдущем V C:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let detailVC = segue.destination as! DetailViewController
let postid = sender as! String
detailVC.postID = postid
}