Как извлечь URL из базы данных firebase и показать URL через UIButton (SWIFT)?

#ios #swift #firebase #firebase-realtime-database

#iOS #swift #firebase #firebase-база данных в реальном времени

Вопрос:

Я пытаюсь получить URL-адрес PDF из базы данных firebase и показать этот URL в формате PDF через UIButton (iOS). Я пробую разные способы, но я не могу заставить это работать. любая помощь будет высоко оценена

       import UIKit
  

импорт SafariServices
импорт FirebaseDatabase
импорт Firebase
импорт WebKit

класс ModelsInfoController: UIViewController, UIWebViewDelegate,UIScrollViewDelegate, WKUIDelegate { переменная WKWebView: WKWebView! var DBRef: ссылка на базу данных! var nextUrl = «https://www.google.co.uk /»

 let infoBttn: UIButton = {
    
    let infoBttn = UIButton (type: .system)
    infoBttn.setTitle("More Info", for: .normal)
    infoBttn.setTitleColor(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), for: .normal)
    infoBttn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
    infoBttn.addTarget(self, action: #selector(retrieveUrl), for: .touchUpInside)
    return infoBttn
  

}()

   @objc  func retrieveUrl () {
       dbRef = Database.database().reference().child("models")
       dbRef.observe(.value) {
           (snapshot) in
           let value = snapshot.value as! NSDictionary
           let url = value["url"]!
           self.nextUrl = (url as! String)
        print (self.nextUrl)
           print ("webview is about to load")
        let request = URLRequest (url: URL(string: self.nextUrl)!)
           self.WKwebView.load(request)
           self.WKwebView.addObserver(self, forKeyPath: #keyPath(WKWebView.isLoading), options: .new, context: nil)
       }
       print ("function observe is called")
   }
  

Я получил эту ошибку :

Не удалось преобразовать значение типа ‘NSNull’ (0x102d85dd0) в ‘NSDictionary’ (0x102d856c8)

Он не извлекает правильный URL-адрес из базы данных (где есть разные URL-адреса для разных моделей).

Я исправил эту ошибку, но по-прежнему не открывает PDF-файл при нажатии кнопки.

Комментарии:

1. Можете ли вы опубликовать свой текущий код?

2. @CongNguyen я сделал, спасибо

3. Что это значит show that URL as a PDF via UIButton ?

4. @CongNguyen я хочу извлечь URL из базы данных, и при нажатии кнопки отображается PDF для этого конкретного дочернего элемента

5. Вы хотите отобразить содержимое PDF с помощью WKWebView, верно?

Ответ №1:

Есть несколько проблем с кодом, но основная из них заключается в понимании данных, которые вы извлекаете с помощью .value

Что у вас есть сейчас, это

 func retrieveUrl () {
   dbRef = Database.database().reference().child("models")
   dbRef.observe(.value) { (snapshot) in
      let value = snapshot.value as! NSDictionary
  

и проблема в том, что ‘models’ содержит другую дочернюю информацию. Ваша структура может быть такой:

 models
   model_0
      url: "some url"
   model_1
      url: "another url"
  

Как вы можете видеть, если ‘models’ наблюдается с помощью .value, загружаются все эти данные в ‘models’, и нет прямого дочернего ‘url’ — прямыми дочерними элементами являются model_0, model_1 и т. Д

Итак, если вы знаете, какой URL-адрес конкретной модели вам нужен, измените ссылку

 let ref = your_firebase.child("models").child("model_1").child("url")
ref.observeSingleEvent.. { snapshot in
   let url = snapshot.value as? String ?? "No Url"
   print(url) //prints 'another url'
  

Обратите внимание, что я также использую .observeSingleEvent вместо .observe. Это потому, что .observer оставляет наблюдателя на этом узле и продолжит запускать события, если какие-либо данные изменятся, и, похоже, вы не хотите этого для данного варианта использования.

К другим моментам, на которые следует обратить внимание:

Эта строка

 print ("function observe is called")
  

будет выполняться до загрузки данных из Firebase. Код быстрее, чем Интернет, поэтому данные firebase действительны только при закрытии, следующем за функцией — любой код после закрытия будет выполнен первым.

У вас также может возникнуть проблема с правилами. Для тестирования убедитесь, что для них установлено значение true, чтобы устранить их как проблему. Обязательно сбросьте их после тестирования, чтобы защитить свои данные.

Комментарии:

1. Спасибо. есть идеи, почему не выполняется действие для отображения ссылки?

2. @levikoci Это отдельная проблема. Сначала вам нужно заставить часть Firebase работать. Убедитесь, что данные загружены и var заполнен, добавив инструкцию print (url), как показано в моем ответе. Как только это заработает, другие проблемы могут быть решены.