使用 Firebase 数据 Swift、Xcode 7 填充 UITableViewController
Posted
技术标签:
【中文标题】使用 Firebase 数据 Swift、Xcode 7 填充 UITableViewController【英文标题】:Populating UITableViewController With Firebase Data Swift, Xcode 7 【发布时间】:2015-12-13 00:24:20 【问题描述】:我正在与swift
在Xcode 7
合作。我对Swift, Xcode, and Firebase
完全陌生。我想在我的 ios 应用程序中有三个 UITableViewController
s。前两个TableView controllers
需要动态内容,第三个 TableView 控制器需要静态内容。我希望第二个和第三个 TableView 控制器根据前一个 TableView 控制器上按下的内容显示数据。所有数据都来自我的 Firebase。我不知道从哪里开始。请指出我正确的方向!谢谢!
【问题讨论】:
@DavidEast 的答案是正确的。在对您的后续问题进行任何故障排除之前,您是否查看过 Firebase QuickStart Guide 并查看您是否可以从干净、新鲜的应用程序中读取/写入 Firebase 中的数据?一旦你有一个基本应用程序工作,添加 tableViews 并从 Firebase 填充它们是微不足道的,但如果它不能正常工作,则必须首先解决。 【参考方案1】:这个问题很笼统,因为它询问如何完成三个不同的任务。
我认为,如果你一次只要求一件事,你最好得到答案。
我可以帮助您使用 Firebase 填充 UITableViewController
。
class MyTableViewController: UITableViewController
// your firebase reference as a property
var ref: Firebase!
// your data source, you can replace this with your own model if you wish
var items = [FDataSnapshot]()
override func viewDidLoad()
super.viewDidLoad()
// initialize the ref in viewDidLoad
ref = Firebase(url: "<my-firebase-app>/items")
override func viewDidAppear(animated: Bool)
super.viewDidAppear(animated)
// listen for update with the .Value event
ref.observeEventType(.Value) (snapshot: FDataSnapshot!) in
var newItems = [FDataSnapshot]()
// loop through the children and append them to the new array
for item in snapshot.children
newItems.append(item as! FDataSnapshot)
// replace the old array
self.items = newItems
// reload the UITableView
self.tableView.reloadData()
此技术使用.Value
事件,您也可以使用.ChildAdded
,但是您必须跟踪.ChildChanged
、'.ChildRemoved' 和.ChildMoved
,这可能会变得非常复杂。
The FirebaseUI library for iOS handles this pretty easily.
dataSource = FirebaseTableViewDataSource(ref: self.firebaseRef, cellReuseIdentifier: "<YOUR-REUSE-IDENTIFIER>", view: self.tableView)
dataSource.populateCellWithBlock (cell: UITableViewCell, obj: NSObject) -> Void in
let snap = obj as! FDataSnapshot
// Populate cell as you see fit, like as below
cell.textLabel?.text = snap.key as String
【讨论】:
非常感谢@DavidEast 的帮助,我一次肯定只会问一个问题。我尝试使用您的代码,它可以工作,除了一件事:for item in snapshot.children
行出现错误,错误为 Use of unresolved identifier 'snapshot'
@WillJackson,对不起,参数名称 snapshot
有错别字。立即尝试
@DavidEast 的错字没问题。我尝试在没有第二部分代码的情况下运行它,并且没有任何数据填充我的 TableViewController。当我添加第二部分时,我收到了错误 Use of unresolved identifier 'dataSource'
和 Use of unresolved identifier 'FirebaseTableViewDataSource'
第二部分是代码示例。这只是为了让您了解它是多么容易。您必须安装该库并阅读文档才能使其运行。将其视为一条建议。
好的@DavidEast,这更有意义。当我使用第一部分代码时,我仍然没有数据。如果它有助于我在调试窗口中得到这个错误2015-12-12 22:43:31.669 The Lighthouse App[3753:170217] CFNetwork SSLHandshake failed (-9807)
【参考方案2】:
当我有一个 UITableViewController 时,我的做法略有不同,特别是对于那些可以推送到另一个详细视图/或在顶部显示模态视图的人。
在 ViewDidAppear 中设置 setObserver 效果很好。但是,我不喜欢这样的事实,即当我查看单元格详细信息视图并随后弹出该视图时,我从 Firebase 获取并再次重新加载表格,尽管可能没有进行任何更改。
这种方式观察者被添加到 viewDidLoad 中,并且只有当它自己从导航控制器堆栈中弹出时才会被移除。视图出现时不会不必要地重新加载表格视图。
var myRef:FIRDatabaseReference = "" // your reference
override func viewDidLoad()
super.viewDidLoad()
setObserver()
override func viewWillDisappear(animated: Bool)
super.viewWillDisappear(animated)
// only called when popped from the Nav Controller stack
// if I push to another detail view my observer will remain active
if isBeingDismissed() || isMovingFromParentViewController()
myRef.removeAllObservers()
func setObserver()
myRef.observeEventType(.Value, withBlock: snapshot in
var newThings = [MyThing]()
for s in snapshot.children
let ss = s as! FIRDataSnapshot
let new = MyThing(snap: ss) // convert my snapshot into my type
newThings.append(new)
self.things = newThings.sort $0.name < $1.name) // some sort
self.tableView.reloadData()
)
我还在UITableViews
中使用.ChildChanged
.ChildDeleted
和.ChildAdded
。它们工作得非常好,并允许您使用 UITableView
动画。它的代码多一点,但没什么难的。
您可以使用.ChildChanged
一次获取一项初始数据,然后它将监控之后的更改。
如果您希望在初始加载时一次获得所有数据,您将需要 .Value,我建议您使用 observeSingleEventOfType
来首次加载表格视图。请注意,如果您还拥有.ChildAdded
观察者,则在添加该观察者时您还将获得一组初始数据 - 因此您需要处理这些项目(即不要将它们添加到您的数据集中)否则您的项目将在初始加载时出现两次。
【讨论】:
以上是关于使用 Firebase 数据 Swift、Xcode 7 填充 UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章
使用 URL (Swift) 从 Firebase 获取数据
使用 swiftyJSON/swift 从 Firebase 解析排行榜数据