【问题标题】:Firebase filling array twice -- SwiftFirebase 填充数组两次——Swift
【发布时间】:2016-09-14 00:25:57
【问题描述】:

我有两个字符串数组:一个保存订单号,一个保存地址。

我在 viewDidAppear 中使用包含以下内容的函数从 Firebase 中提取数据:

    self.localOrderNumberArray.removeAll()
    self.localAddressArray.removeAll()

    self.orderNumbers.removeAll()
    self.addresses.removeAll()

    self.tableView.reloadData()

    if onItsWayCompanyNameStoreNumberCourierNumberRootRef != nil {

        let deliveryRef = onItsWayCompanyNameStoreNumberCourierNumberRootRef.childByAppendingPath("deliveries")

        deliveryRef.observeEventType(.ChildAdded, withBlock: { snapshot in

            self.orderNumbers.removeAll()
            self.addresses.removeAll()

            print(snapshot.value.objectForKey("orderNumber"))
            let orderNumberPulledFromFirebase = snapshot.value.objectForKey("orderNumber") as! String
            self.localOrderNumberArray.insert(orderNumberPulledFromFirebase, atIndex: 0)

            let addressPulledFromFirebase = snapshot.value.objectForKey("address") as! String
            self.localAddressArray.insert(addressPulledFromFirebase, atIndex: 0)

            self.orderNumbers = self.localOrderNumberArray
            self.addresses = self.localAddressArray

            self.tableView.reloadData()

        })
    }

该函数使用从 Firebase 提取的数据填充 UITableView。

当我第一次运行应用程序时,一切都很好。我可以通过不同的函数向 Firebase 添加数据,上面的函数会将新数据拉入 UITableView 就好了。

但是,当我转到另一个视图控制器(在本例中为另一个 UITableView),然后返回到包含上述函数的视图时,该函数会填充订单号和地址数组两次 当我添加新数据

如果我第二次切换到另一个 UITableView,然后返回到包含上述函数的视图,该函数会在我添加新数据时将订单号和地址数组填充 3 次。等等等等。

这是最奇怪的事情。我想不通,它即将把我逼到边缘。请帮忙。

【问题讨论】:

  • @JohnV 听起来不错。谢谢!

标签: ios arrays swift uitableview firebase


【解决方案1】:

您在viewDidAppear 中呼叫deliveryRef.observeEventTypeviewDidAppear 将在每次出现 ViewController 时被调用。因此,当您转到其他 ViewController 并返回时,将再次调用 viewDidAppear 并再次注册 deliveryRef.observeEventType。所以有效地有两个监听器在你的 viewController 中做同样的工作,这会将重复的数据添加到数组中。

你必须实现一个逻辑,在 ViewController 中只执行一次observeEventType

【讨论】:

  • 谢谢!你让我朝着正确的方向前进。对于将来可能遇到此问题的人:我将“deliveryRef.observeEventType(.ChildAdded, withBlock: { snapshot in”设置为句柄(类似于here)。然后,作为segue函数的一部分,我调用了deliveryRef.removeObserverWithHandle(handle!)。这断开了观察者的连接,然后当我返回原始视图时允许观察者第一次注册。
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2020-05-01
相关资源
最近更新 更多