Ios Swift Firebase完成块无限循环

Ios Swift Firebase完成块无限循环,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在制作一个应用程序,可以在firebase中保存许多书籍。我遇到了一个非常奇怪的问题,我的应用程序在添加新书时会无限循环,并尽可能快地继续添加同一本书。如果有什么方法可以让更有经验的人看一看,我将非常感激 @IBAction func userHasBook(sender: AnyObject) { // Called after filling a new book form let email = FIRAuth.auth()?.currentUser?.email!

我正在制作一个应用程序,可以在firebase中保存许多书籍。我遇到了一个非常奇怪的问题,我的应用程序在添加新书时会无限循环,并尽可能快地继续添加同一本书。如果有什么方法可以让更有经验的人看一看,我将非常感激

@IBAction func userHasBook(sender: AnyObject) { // Called after filling a new book form

    let email = FIRAuth.auth()?.currentUser?.email!
    let school = email!.substringWithRange(Range(email!.characters.indexOf("@")!.advancedBy(1) ..< email!.characters.indexOf(".")!)) // for db organization


    //A few lines here that ensure that the fields are filled correctly (clutter so i didn't add them)


    ref.child(school).observeEventType(.Value, withBlock: { (snapshot) in
        self.bookIndex = snapshot.value!["numSelling"] as! Int
        self.addSellingBook(); // we now know it is done finding the value, right?
    }) { (error) in
        print(error.localizedDescription)
    }
}

func addSellingBook(){
    let bookRef = self.ref.child(school).child("selling").child(Int(self.bookIndex).description)

    let book : [NSObject : AnyObject] = ["uid": (FIRAuth.auth()?.currentUser?.uid)!,
                "title": self.titleField.text!,
                "authors": self.authorsField.text!,
                "edition": self.editionField.text!,
                "price": self.priceField.text!,
                "isbn" : self.isbn] // this is the data that is added infinitely many times

    bookRef.updateChildValues(book, withCompletionBlock: { (NSError, FIRDatabaseReference) in //update the book in the db
        let newIndex = self.bookIndex + 1
        self.ref.child(self.school).child("numSelling").setValue(newIndex, withCompletionBlock: { (NSError, FIRDatabaseReference) in // after that update the index
            self.performSegueWithIdentifier("backToMain", sender: nil) // and after that go back to main 
        })
    })

然后,我添加了另一本书(索引为2),它继续添加无限多的书并无限增加索引(numSelling)。我不想发布JSON,因为它有300行长。

请更改您的代码,因为我在下面的方法中实现了将其设置为在线/离线

//标记:-用户在线/离线

func setUserOnlineOffline(userId: String!, isOnline: Bool!) {
        Let ref = FIRDatabase.database().reference().child(FIRPATH_USER_USERID_DETAILS(userId))

        if isOnline == true {
            ref.updateChildValues(["last_seen": "Online"])
        } else {
            ref.updateChildValues(["last_seen": FIRServerValue.timestamp()])
        }

        ref.onDisconnectUpdateChildValues(["last_seen": FIRServerValue.timestamp()])
    }

//注意:这里您必须设置字符串,因此请将nsobject的字典替换为字符串。。可能会对您有所帮助

找到它,您必须使用ObserveEventOfType,而不是使用observeEventType

您试图用
bookRef.UpdateChildValue做什么(..
您是否试图用本书的详细信息附加DB节点?给出您的JSON树。这就是无限循环开始的地方吗?似乎如果您的数据库中有数据,您正在通过调用
observeEventType
来检索数据,完成后它将运行
addSellingBook
,这使它陷入循环。看。我试图解释firebase函数是如何使用的。对于上述方法,你必须为此编写逻辑。我认为你会从firebase中得到许多对象,这就是为什么它会循环。我认为,你只是firebase的初学者。我相信像你这样的firebase专家可以详细说明如何解决OP问题轮。请更新您的答案与实际解决方案,而不是您的建议。PS:-OP与用户是在线还是离线无关…我教你如何编写代码和逻辑,你必须开发。Firebase是干净的pad,你必须按照要求设置逻辑bro。如果你想直接现成的功能,然后使用XMPP。在这里,我们将在你的道路上,但你必须自己走。祝你好运。尽管我很欣赏你的教导。没有人要求你写代码。问题是如何退出无限循环。解决方案是将
observeEventType
替换为
observeSingleEventOfType
,因为
observeSingleEventOfType
删除侦听器当网络线程从数据库中检索到第一个快照时,
observeEventType
会继续侦听。这是一条路径。您在这里所做的是像WhatsApp中一样在线/离线检查用户。您的答案甚至与所问问题没有任何关联。我同意您的“显示路径”,但显示一条相关路径。。
func setUserOnlineOffline(userId: String!, isOnline: Bool!) {
        Let ref = FIRDatabase.database().reference().child(FIRPATH_USER_USERID_DETAILS(userId))

        if isOnline == true {
            ref.updateChildValues(["last_seen": "Online"])
        } else {
            ref.updateChildValues(["last_seen": FIRServerValue.timestamp()])
        }

        ref.onDisconnectUpdateChildValues(["last_seen": FIRServerValue.timestamp()])
    }