使用 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 【问题描述】:

我正在与swiftXcode 7 合作。我对Swift, Xcode, and Firebase 完全陌生。我想在我的 ios 应用程序中有三个 UITableViewControllers。前两个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 获取数据

使用 swift 将数据写入 Firebase

使用 swiftyJSON/swift 从 Firebase 解析排行榜数据

Firebase 数据比较 swift

使用 Firebase 数据 Swift、Xcode 7 填充 UITableViewController

无法使用 Swift 4 将数据写入 Firebase 实时数据库