2016-09-09 5 views
0

Я делаю приложение, которое хранит много книг в firebase. Я получаю очень странную проблему, когда мое приложение будет бесконечным циклом при добавлении новой книги и продолжит добавлять ту же книгу, насколько это возможно. Если бы был какой-то способ, с которым мог бы взглянуть более опытный человек, я был бы очень благодарен.Swift Firebase Completion Block Infinite Loop

@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 
     }) 
    }) 

Спасибо тонну и спросите меня, если вам нужно что-нибудь еще!

EDIT: JSON ПЕРЕД НИЖЕ

{ 
     "colorado" : { 
      "numBuying" : 0, 
      "numSelling" : 0, 
     "users" : { 
       "2nU0jp4ITjgQ6ElSQWc7t5qj62t1" : { 
        "email" : "[email protected]" 
       } 
      } 
     }, 
     "creek" : { 
      "numBuying" : 0, 
      "numSelling" : 2, 
      "selling" : [ { 
      "authors" : "A. S. A. Harrison", 
      "edition" : "Only Edition", 
      "isbn" : "1101608064", 
      "price" : "5.00", 
      "title" : "The Silent Wife", 
      "uid" : "eJvdVx3J8EYZPH3mlbYLBcPDkD12" 
      }, { 
      "authors" : "Jamie McGuire", 
      "edition" : "Only Edition", 
      "isbn" : "1476712050", 
      "price" : "5.00", 
      "title" : "Beautiful Disaster", 
      "uid" : "eJvdVx3J8EYZPH3mlbYLBcPDkD12" 
      } ], 
     "users" : { 
       "eJvdVx3J8EYZPH3mlbYLBcPDkD12" : { 
        "email" : "[email protected]" 
       } 
      } 
     } 
    } 

Затем я добавляю еще одну книгу (индекс 2) и скорее продолжает добавлять бесконечные книги и бесконечно увеличивает индекс (numSelling). Я не хочу публиковать этот JSON, поскольку он похож на 300 строк.

+0

Что вы пытаетесь сделать с помощью 'bookRef.updateChildValues ​​(..', пытаетесь ли вы добавить узел базы данных с этой книжной деталью? JSON tree.And это, где начинается ваш бесконечный цикл.? – Dravidian

+1

Кажется, что если у вас есть данные в вашей базе данных, вы получаете их, вызывая 'observEventType', и когда это будет завершено, он будет запускать' addSellingBook', и это заставляет его перемещаться по кругу. –

ответ

-1

Пожалуйста, измените свой код, как я применил ниже, чтобы установить онлайн/офлайн.

// МАРК: - Пользователи на сайте/форуме

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 с строки .. может быть полезным для вас

+0

См. Я пытаюсь объяснить, как использовать функцию firebase. для метода выше вы должны написать для этого логику. Я думаю, вы получите много объектов в ответ от Firebase, поэтому он будет проходить в цикле. – Mehul

+0

Я думаю, вы только начинающий в Firebase. – Mehul

+0

Я уверен, что эксперт по firebase, как и вы, может подробно рассказать о том, как решить проблему OP проблемы. Пожалуйста, обновите свой ответ с помощью фактического решения, а не вашего предложения. PS: - OP не имеет никакого отношения к тому, чтобы пользователь был в сети или в автономном режиме ... – Dravidian

1

выяснилось, вместо использования функции registerEventType вы должны использовать функцию observSingleEventOfType