Skip to content

Instantly share code, notes, and snippets.

@xcadaverx
Created May 30, 2016 20:10
Show Gist options
  • Save xcadaverx/0963c471ef84e805e572c6a803d93f40 to your computer and use it in GitHub Desktop.
Save xcadaverx/0963c471ef84e805e572c6a803d93f40 to your computer and use it in GitHub Desktop.
//
// ViewController.swift
// flamingpants-firebase-tutorial
//
// Created by Daniel Williams on 5/29/16.
// Copyright © 2016 Dandom, LLC. All rights reserved.
//
import UIKit
import Firebase
import RxCocoa
import RxSwift
import SlackTextViewController
import FirebaseRxSwiftExtensions
class ViewController: SLKTextViewController {
var messageModels: [MessageModel] = [MessageModel]()
var isInitialLoad = true
var name = "Daniel"
var disposeBag = DisposeBag()
var pressedRightButtonSubject: PublishSubject<String> = PublishSubject()
var messagesRef: Firebase!
override func viewDidLoad() {
super.viewDidLoad()
self.registerPrefixesForAutoCompletion([""])
tableView?.registerClass(MessageTableViewCell.self, forCellReuseIdentifier: MessageTableViewCell.REUSE_ID)
tableView?.rowHeight = UITableViewAutomaticDimension
tableView?.estimatedRowHeight = 50.0
inverted = true
let rootRef = Firebase(url: "https://YOURFIREBASEAPP.firebaseio.com/")
messagesRef = rootRef.childByAppendingPath("messages")
messagesRef.rx_observe(.ChildAdded)
.map { snapshot in
return MessageModel(snapshot: snapshot) }
.subscribeNext { (messageModel: MessageModel) in
self.messageModels.insert(messageModel, atIndex: 0)
if self.isInitialLoad == false {
self.tableView?.beginUpdates()
self.tableView?.insertRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Automatic)
self.tableView?.endUpdates()
}
}
.addDisposableTo(disposeBag)
messagesRef.observeSingleEventOfType(.Value) { (snapshot: FDataSnapshot!) in
self.tableView?.reloadData()
self.isInitialLoad = false
}
pressedRightButtonSubject
.flatMap { bodyText -> Observable<Firebase> in
let name = self.name
return self.messagesRef.childByAutoId().rx_setValue(["name": name, "body": bodyText])
}
.subscribeNext { (newMessageReference:Firebase) -> Void in
print("a new message was commited to firebase.")
}
.addDisposableTo(disposeBag)
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messageModels.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(MessageTableViewCell.REUSE_ID, forIndexPath: indexPath) as! MessageTableViewCell
let messageModelAtIndexPath = messageModels[indexPath.row]
cell.nameLabel.text = messageModelAtIndexPath.name
cell.bodyLabel.text = messageModelAtIndexPath.body
cell.transform = tableView.transform
return cell
}
override func didPressRightButton(sender: AnyObject?) {
pressedRightButtonSubject.onNext(textView.text)
super.didPressRightButton(sender)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment