2016-09-14 1 views
0

Я делаю простое приложение для работы с CRUD с Firebase - добавление, обновление и удаление. Я выполнил их все, за исключением того, что у меня проблема с обновлением.Поиск старой ценности предмета в Firebase после обновления

Я могу получить ссылку на нужного пользователя при обновлении дочернего значения и успешно его обновить в консоли firebase. Это код, который я использовал для этого:

let ref = FIRDatabase.database().reference().child("Users") 
    ref.observeEventType(.ChildAdded, withBlock: { (snapshot) in 

     guard let dictionary = snapshot.value as? [String:AnyObject] else { return } 

     if self.firstNameField.text == dictionary["firstname"] as? String 
     { 
      if let lastname = dictionary["lastname"] 
      { 
       print("Here is the lastname of the current person \(lastname)") 

       guard let firstname = self.firstNameField.text, lastname = self.lastNameField.text, dateOfBirth = self.dateOfBirthField.text, zipcode = Int(self.zipcodeField.text!) else 
       { 
        print("Form not valid") 
        return 
       } 

       let properties: [String: AnyObject] = ["firstname": firstname, "lastname": lastname, "Date of Birth": dateOfBirth, "Zipcode": zipcode] 

       let currentKey = snapshot.key 
       ref.child(currentKey).updateChildValues(properties, withCompletionBlock: { (error, ref) in 

        if error != nil 
        { 
         print("We have an error updating the data \(error)") 
        } 

        print("We were able to update the entry in the reference \(ref)") 

       }) 
      } 
     } 

    }, withCancelBlock: nil) 

Мой вопрос заключается в TableViewController не обновляя надлежащего индекса, как только я уволить EditViewController. Метод tableview.reloadData() для этого не работает, поэтому я считаю, что мне нужно исправить его в моем методе ChildChanged. Вот код для этого:

ref.observeEventType(.ChildChanged, withBlock: { (snapshot) in 

     print("One of the entries were changed so we're reloading the table view") 

     if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
     { 
      let fullname = "\(firstname) \(lastname)" 
      self.names[I_Need_This_Index] = fullname 
      print(fullname) 

      dispatch_async(dispatch_get_main_queue()) 
      { 
       self.tableView.reloadData() 
      } 
     } 

    }, withCancelBlock: nil) 

Код выше в методе, называемом observePeople(), который вызывается при методе viewDidLoad. Метод observPeople() обрабатывал уведомления ChildAdded, ChildRemoved и ChildChanged.

Как я могу правильно перейти к старому индексу и изменить старое значение на новое значение, чтобы представление таблицы обновилось правильно?

+0

Просто измените 'dataSource [indexOfCellThatChanged]' в момент обновления значений .-> Вызовите reloadTableView. – Dravidian

+0

что бы я его изменил? И как мне получить доступ к нему из моего другого контроллера? –

ответ

0

Вот временное решение, у меня есть, что работает только один раз, а затем не работает после того, что:

создать глобальную переменную строку под названием «ogFullName» и установить его в полное имя во время ребенок добавил код. Затем в моем ребенке изменился код, я установил «ogFullName» в индекс элемента, который я пытаюсь изменить. Это немного сложно для меня, чтобы объяснить это словами, так вот код:

var ogFullname:String? 

func observePeople() 
{ 
    let ref = FIRDatabase.database().reference().child("Users") 
    ref.observeEventType(.ChildAdded, withBlock: 
    { (snapshot) in 

     if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
     { 
      let fullname = "\(firstname) \(lastname)" 
      self.ogFullname = fullname //the old name 
... 

А вот в моем ChildChanged код:

ref.observeEventType(.ChildChanged, withBlock: { (snapshot) in 

     print("One of the entries were changed so we're reloading the table view") 

     if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
     { 
      let fullname = "\(firstname) \(lastname)" 
      if let ogname = self.ogFullname 
      { 
       if let originalIndex = self.names.indexOf(agnate) //finding the index of the unchanged name 
       { 
        self.names[originalIndex] = fullname //setting the old name to the changed one 
       } 

Это решение работает только один раз в сборке. После этого он продолжает то же поведение обновлений, отображаемых на консоли, но не в виде таблицы.

Смежные вопросы