diff options
Diffstat (limited to 'Example/tvOSSample/tvOSSample/DatabaseViewController.swift')
-rw-r--r-- | Example/tvOSSample/tvOSSample/DatabaseViewController.swift | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/Example/tvOSSample/tvOSSample/DatabaseViewController.swift b/Example/tvOSSample/tvOSSample/DatabaseViewController.swift new file mode 100644 index 0000000..712c48f --- /dev/null +++ b/Example/tvOSSample/tvOSSample/DatabaseViewController.swift @@ -0,0 +1,83 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import FirebaseDatabase + +/// A class to demonstrate the Firebase Realtime Database API. This will show a number read +/// from the Database and increase or decrease it based on the buttons pressed. +class DatabaseViewController: UIViewController { + private enum Counter: Int { + case increment = 1 + case decrement = -1 + + var intValue: Int { + return rawValue + } + } + + // MARK: - Interface + + /// Label to display the current value. + @IBOutlet weak var currentValue: UILabel! + + // MARK: - User Actions + + /// The increment button was hit. + @IBAction func incrementButtonHit(_ sender: UIButton) { changeServerValue(with: .increment) } + + /// the decrement button was hit. + @IBAction func decrementButton(_ sender: UIButton) { changeServerValue(with: .decrement) } + + // MARK: - Internal Helpers + + /// Update the number on the server by a particular value. Note: the number passed in should only + /// be one above or below the current number. + private func changeServerValue(with type: Counter) { + let ref = Database.database().reference(withPath: Constants.databasePath) + // Update the current value of the number. + ref.runTransactionBlock { (currentData) -> TransactionResult in + guard let value = currentData.value as? Int else { + return TransactionResult.abort() + } + + currentData.value = value + type.intValue + return TransactionResult.success(withValue: currentData) + } + } + + // MARK: - View Controller Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() + + // Observe the current value, and update the UI every time it changes. + let ref = Database.database().reference(withPath: Constants.databasePath) + + ref.observe(.value) { [weak self] (snapshot) in + guard let value = snapshot.value as? Int else { + print("Error grabbing value from Snapshot!") + return + } + + self?.currentValue.text = "\(value)" + } + } + + // MARK: - Constants + + private struct Constants { + static let databasePath = "magicSyncingCounter" + } +} |