Firebase PushViewController多次推送

时间:2017-06-10 21:48:30

标签: swift firebase

在我的项目中,我删除了故事板中的所有segue并更改了所有

performSegue...

成为

pushViewController...

在我的应用程序中,75%的时间都可以完美运行。但是,当我在Firebase方法中时,我尝试这样做VC我会在屏幕上多次闪烁。

我认为Firebase与它有关,因为我创建了一个简单的方法

func testDel() {
    if let addVC = self.storyboard?.instantiateViewController(withIdentifier: "AddCardVC") as? AddCardViewController {
        self.navigationController?.pushViewController(addVC, animated: true)
        print("foo")
    }
}

它完全按照预期工作,去了第二个VC,就是它......

在发布我的代码之前,我为删除原始问题而道歉。我的编辑太多了。

到目前为止,我已经尝试将推送包裹在

DispatchQueue.main.async {...}

这没有效果。

我去了第二个VC并注释掉了所有的功能,并在任何有pushVC的线上放置了断点,只是为了看它是否自动触发......

我在推送后立即在方法中放置了一个print语句并打印一次。我还在第二个VC ViewWillAppear中放置了一个print语句,并且被调用了5次。

我尝试评论我的推送代码,并在故事板上添加了一条segue线,并采用了老式的方式,并且做了类似的事情,但是我在控制台中有一个日志说

  

对开始/结束外观转换的不平衡调用   的UIViewController ...

当我使用push

时,这不会出现

我还在SO上发现了一篇较旧的帖子,其中有人建议使用以下代码

var shouldPush = true

if let navigationController = self.navigationController {
for viewController in navigationController.viewControllers {
if viewController is AddCardViewController {
shouldPush = false
}
}
}

if shouldPush {
let addCrd = AddCardViewController(nibName: nil, bundle: nil)                       self.navigationController?.pushViewController(addCrd, animated: true)
}

这使得闪烁从大约5点变为2.仍然不是很好。

我的完整代码就是这个

// MARK: Delete Card with UIAlert

func deleteCard() {

    let alertController = UIAlertController(title: "Wait!", message: "This will completely remove this card from your account. All the services linked to this card will be removed. Your total fixed monthly expenses will also be erased!", preferredStyle: UIAlertControllerStyle.alert)

    let cancelAction = UIAlertAction(title: "Never Mind!", style: UIAlertActionStyle.cancel, handler: nil)

    let okAction = UIAlertAction(title: "I Understand!", style: UIAlertActionStyle.default) { (result: UIAlertAction) in

        let thisCard = self.ref.child("cards").child(self.thisCardIDTransfered)
        let thisCardInUsers = self.ref.child("users").child((self.user?.uid)!).child("cards").child(self.thisCardIDTransfered)

        thisCard.removeValue()
        thisCardInUsers.removeValue()

        let cardNode = self.ref.child("users").child((self.user?.uid)!).child("cards")

        cardNode.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChildren() {

                if let walletVC = self.storyboard?.instantiateViewController(withIdentifier: "WalletVC") as? CardWalletViewController {
                    self.navigationController?.pushViewController(walletVC, animated: true)
                }

            } else {

                if let addVC = self.storyboard?.instantiateViewController(withIdentifier: "AddCardVC") as? AddCardViewController {
                    self.navigationController?.pushViewController(addVC, animated: true)
                    print("foo")
                }
            }
        })
    }

    alertController.addAction(cancelAction)
    alertController.addAction(okAction)

    self.present(alertController, animated: true, completion: nil)
}

2 个答案:

答案 0 :(得分:0)

cardNode.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChildren() {
               ...

            } else {

            ...
        })

可能会多次调用此观察者并使您的视图被多次推送,也许检查快照包含的内容可以帮助您解决问题。我猜测有时这个观察者会发射,快照可能是空的。

cardNode.observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.value is NSNull {
            //do Nothing
        } else {
           //check if it contains children
        }

我不建议使用观察员来决定你应该展示什么样的观点。特别是因为你正在听.value,因为它们可能意外发射而忘记删除观察者会导致许多错误。

答案 1 :(得分:0)

所以有人帮助了我,为什么打印报表的顺序一直发生直到他看到我的项目的其余部分,这是非常令人困惑的......

在其他ViewControllers上,我有Firebase观察方法....当我推送到另一个VC时,我只是添加到堆栈...该方法仍然在后台运行,所以我有2个观察员在做一个pushViewController。

我们最终将其中一些更改为ObserveSingleEvent ... 他告诉我,我们可以做完

viewDidDisappear

所以我想这有助于我更好地了解应用的运作方式。