Firebase填充阵列两次 - 斯威夫特

tst*_*eve 4 arrays uitableview ios firebase swift

我有两个String数组:一个包含订单号,另一个包含地址.

我使用包含以下内容的函数从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()

        })
    }
Run Code Online (Sandbox Code Playgroud)

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

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

但是,当我转到另一个视图控制器(在这种情况下是另一个UITableView),然后返回到保存上述函数的视图时,该函数在添加新数据时填充订单号和地址数组两次.

如果我第二次转到另一个UITableView,然后回到上面保存上述函数的视图,当我添加新数据时,该函数会填充订单号和地址数组三次.等等等等.

这是最奇怪的事情.我无法理解,而且它会让我超越边缘.请帮忙.

Aru*_*nGJ 6

您正在呼叫deliveryRef.observeEventTypeviewDidAppear.viewDidAppear每次呈现ViewController时都会调用它.因此,当您转向其他ViewController并返回时,viewDidAppear将再次调用并再次deliveryRef.observeEventType注册.因此有效地有两个监听器在viewController中执行相同的工作,这将向数组添加重复数据.

您必须observeEventType在ViewController中实现仅执行一次的逻辑.

  • 谢谢!你让我朝着正确的方向前进 对于那些将来可能遇到此问题的人:我将"deliveryRef.observeEventType(.ChildAdded,withBlock:{snapshot in"设置为句柄(类似于[here](http://stackoverflow.com/questions/27124118/) firebase-removal-observers)).然后,作为segue函数的一部分,我调用了deliveryRef.removeObserverWithHandle(句柄!).这使观察者断开连接,然后当我返回到原始视图时,观察者第一次注册. (3认同)