2017-06-13 35 views
0

我使用TableViewController创建Swift Firebase应用程序,其中tableview的每个部分都是一个房间,每一行都是每个房间的家具。加入价值变化时Firebase数据未更新

现在的问题:第一次加载一切工作正常,当任何房间正在改变/从后端删除表视图更新就好了。但是,当我的任何家具价值更新时,我有一个问题需要重新加载数据。我不知道如何改变我的代码来获得这个工作。我开始想我可能会使用不正确的数据结构?我该如何解决这个问题?

的火力地堡数据库的结构是这样的(I除去从该结构的某些键/值只是为了简化所以真正的结构具有更多的值):

rooms: 
{ 
    "room 1": { 
     "name": "Bedroom", 
     "somedata": 1 
    }, 
    "room 2": { 
     "name": "Living room", 
     "somedata": 2 
    } 
} 

furniture: 
{ 
    "room 1": { 
     "furniture 2": { 
      "name": "Chair" 
     }, 
     "furniture 3": { 
      "name": "Sofa" 
     } 
    }, 
    "room 2": { 
     "furniture 1": { 
      "name": "Table" 
     } 
    } 
} 

我使用加载数据中的代码该TableViewController是:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    DataManager.shared.getRooms(completion: { (rooms) in 
     self.rooms = rooms 
     self.tableView.reloadData() 
    }) 
} 

的DataManager:

func getRooms(completion:@escaping ([Room])->Void) { 
    FIRDatabase.database().reference(withPath: "rooms").observe(.value, with: { snapshot in 
     var rooms: [Room] = [] 
     var counter: UInt = 0 
     for roomItem in snapshot.children { 
      let room = Room(snapshot: roomItem as! FIRDataSnapshot) 
      FIRDatabase.database().reference(withPath: "furniture/\(room.key)").observe(.value, with: { snap in 
       for furnitureItem in snap.children { 
        let furniture = Furniture(snapshot: furnitureItem as! FIRDataSnapshot) 
        room.furnitureList.append(furniture) 
       } 

       counter = counter + 1 
       if (counter == snapshot.childrenCount) { 
        completion(rooms) 
       } 
      }) 

      rooms.append(room) 
     } 
    }) 
} 

谢谢帮助!

+0

要在这里刺一下它,也许尝试在调度异步中包装完成回调? – TNguyen

+0

我认为这不应该需要?请看下面的评论 – Martin

+0

嗯,很难指出问题只能看到那么多。你可能会尝试双重检查,看看你的回调是否在更换家具后被调用? – TNguyen

回答

0

你需要调用self.tableView.reloadData()像这样:

DispatchQueue.main.async { 
    self.tableView.reloadData() 
} 

而且,不需要调用该函数在viewDidAppear。请致电viewDidLoad

+0

非常感谢!从我的理解你不需要使用DispatchQueue,因为这已经发生在主线程上,至少根据这个帖子:https://stackoverflow.com/questions/39178165/firebase-asynchronous-function-whats-in-后台队列和什么 - 不 – Martin

+0

我把它放在viewWillAppear,因为如果这篇博文发布https://firebase.googleblog.com/2015/10/best-practices-for-ios-uiviewcontroller_6.html)它说“在viewWillAppear中创建监听器,而不是在viewDidLoad中”。这不正确吗? – Martin

+0

关于在哪里观察:https://stackoverflow.com/questions/37895171/new-firebase-retrieve-data-and-put-on-the-tableview-swift –