#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), как показано в моем ответе. Как только это заработает, другие проблемы могут быть решены.