2016-09-20 3 views
0

У меня есть код, который получает каждое сообщение и показывает все это в uitableviewcontroller. Код, который получает все посты от firebase это:Показать только сообщения от текущего пользователя - firebase swift

viewDidLoad { 
dbRef = FIRDatabase.database().reference().child("feed-items") 
    startObersvingDB() 

} 

func startObersvingDB() { 
    dbRef.observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 
     var newUpdates = [Sweet]() 

     for update in snapshot.children { 
      let updateObject = Sweet(snapshot: update as! FIRDataSnapshot) 
      newUpdates.append(updateObject) 

     } 

     self.updates = newUpdates 
     self.tableView.reloadData() 


    }) { (error: NSError) in 
     print(error.description) 
    } 
} 

Как я могу изменить эту часть просто получать обновления от конкретного пользователя? Моя структура в firebase, как это:

feed-items { 
    unique-user-id { 
      post: "This is a post" 
      byUsername: "MyUser" 
    } 
} 

Так что код должен делать, это извлечение строки byUsername - Я просто не могу понять, как обновить свой код, чтобы сделать это. Надеюсь, что вы, ребята, можете помочь мне :-)

ответ

3

Попробуйте это: -

Swift 3

func startObersvingDB() { 
FIRDatabase.database().reference().child("feed-items").queryOrdered(byChild: "byUsername").queryEqual(toValue: "MyUser").observe(.value, with: { (snapshot: FIRDataSnapshot) in 
    var newUpdates = [Sweet]() 

    for update in snapshot.children { 
     let updateObject = Sweet(snapshot: update as! FIRDataSnapshot) 
     newUpdates.append(updateObject) 

     } 

     self.updates = newUpdates 
     self.tableView.reloadData() 


     }) { (err) in 
     print(err!.localisedDescription)  
     } 
    } 

Swift 2

func startObersvingDB() { 
FIRDatabase.database().reference().child("feed-items").queryOrderedbyChild("byUsername").queryEqualtoValue("MyUser").observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 
    var newUpdates = [Sweet]() 

    for update in snapshot.children { 
     let updateObject = Sweet(snapshot: update as! FIRDataSnapshot) 
     newUpdates.append(updateObject) 

    } 

    self.updates = newUpdates 
    self.tableView.reloadData() 


    }) { (error: NSError) in 
     print(error.description) 
    } 
    } 
0

Из того, что я могу собрать вас выборка каждого ребенка из feed-items с помощью for update in snapshot.children {...} Вы никогда не используете ключ unique-user-id, чтобы получить конкретный идентификатор пользователя. Вы должны либо написать database rule, чтобы позволить пользователю просматривать только свои собственные элементы ИЛИ вы можете использовать следующий метод (Swift 3 синтаксис):

1) Получение идентификатора пользователя из FIRAuth:

if let user = FIRAuth.auth()?.currentUser { 
    for profile in user.providerData { 
     providerDataID = profile.providerID // save UID in variable e.g. providerDataID 
     // fetch other FIRAuth stuff 
    } 

2) Получить только проходные элементы с вашой UID:

ref.child("feed-items").child(providerDataID).observeSingleEvent(of: .value, with: { (snapshot) in  
    if let userInfoDict = snapshot.value as? NSDictionary { 
    // get values from the proper providerDataID ONLY 
} 

Альтернатива: при выполнении для цикла в вашей проверке коды каждого ребенка UID, если это соответствует вашему пользователю, но что бы вверх некоторая полоса пропускания, если у вас большой БД

+0

Уникальный идентификатор пользователя «пропущен», так как я ищу только snapshot.children, но кто-то уже нашел мой ответ :-) Спасибо за ваше время! –

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