Постоянная база данных Firebase Realtime создает нулевое значение в снимке - PullRequest
0 голосов
/ 13 октября 2019

Так что мое приложение работало нормально;Я сохранил базу данных локально, используя:

Database.database().isPersistenceEnabled = true

Я ничего не изменил, но внезапно он начал возвращать нулевой снимок. Когда я закомментирую эту строку, все снова работает нормально, и метка в интерфейсе отображается правильно, и это значение правильно синхронизируется на нескольких устройствах. Вот фрагмент кода из моего viewDidLoad:

import UIKit
import Firebase
import FirebaseDatabase

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var returnedName: UILabel!
    @IBOutlet weak var scannedURLTextField: UITextField!
    @IBOutlet weak var reentries: UILabel!
    @IBOutlet weak var visitors: UILabel!
    @IBOutlet weak var ticketType: UILabel!
    @IBOutlet weak var statusImage: UIImageView!
    @IBOutlet weak var entryOrReentrySwitch: UISwitch!


    var qrDecodedURL : String!
    var ticketNumber : String!
    var eventID : String!
    var numberOfAttendees: String!
    var urlDictionary = [String : Any]()
    var attendeeRef: DatabaseReference!
    var ticketRef : DatabaseReference!
    var entries : DatabaseReference!
    var entriesRef : DatabaseReference!
    var reentriesRef : DatabaseReference!
    var entriesInt : Int!
    var reentriesInt : Int!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        Database.database().isPersistenceEnabled = true

        attendeeRef = Database.database().reference(withPath: "attendees")
        ticketRef = Database.database().reference(withPath: "tickets")

        entriesRef = Database.database().reference(withPath: "entries")

        reentriesRef = Database.database().reference(withPath: "reentries")

        self.scannedURLTextField .becomeFirstResponder()
        scannedURLTextField.inputView=UIView()//create dummy view to supress keyboard

        //        Incresase size of switch
        entryOrReentrySwitch.transform = CGAffineTransform(scaleX: 1.5, y: 1.5);

        //monitor for changes in entries
        entriesRef.child("entries").observe(.value, with: { (snapshot) in
            print(snapshot);
            self.visitors.text = "Visitors: \(snapshot.value as! String)"
            let tempValue = snapshot.value as! String
            self.entriesInt = Int(tempValue)
        })


        //Monitor for changes in reentries
        reentriesRef.child("reentries").observe(.value, with: { (snapshot) in
            //            print(snapshot);
            self.reentries.text = "Reentries: \(snapshot.value as! String)"
        })

        statusImage.image = UIImage.init(named: "scanQR.png")
    }

Сгенерирована ошибка:

Could not cast value of type 'NSNull' (0x1fb2f3270) to 'NSString' (0x1fb2fcab8).
2019-10-12 18:05:54.061687-0700 VIM Tickets[621:97014] Could not cast value of type 'NSNull' (0x1fb2f3270) to 'NSString' (0x1fb2fcab8).

Ошибка на self.visitors.text = "Visitors: \(snapshot.value as! String)" в мониторе для изменений в разделе записей. Опять же, все работает нормально, и в моментальном снимке есть данные, когда я закомментирую строку сохранения базы данных. Я даже переместил его в AppDelegate, но у него тот же результат.

Я немного растерялся из-за того, почему это происходит, когда постоянство работало раньше. Любые предложения будут с благодарностью!

1 Ответ

0 голосов
/ 13 октября 2019

Когда у вас включено постоянство диска, клиент Firebase немедленно запускает текущее значение, которое он знает для узла. Похоже, в вашем случае он думает, что значение null, поэтому он срабатывает с этим. Если у вас есть подключение к серверу, через несколько секунд оно сработает с правильным значением, полученным с сервера.

Обычный подход к этой ситуации - сначала проверить, существует ли моментальный снимок, перед обработкой его содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...