2016-04-06 9 views
4

Я пытаюсь разрешить пользователям запускать игры с другими пользователями и следить за ними, ища их имя пользователя. Мне нужно убедиться, что пользователь с таким именем пользователя существует. Я использовал следующий код, но хотя if называется else, он не вызывается, когда ему это нужно.Swift & Firebase | Проверка наличия пользователя с именем пользователя

let checkWaitingRef = Firebase(url:"https://test.firebaseio.com/users") 
checkWaitingRef.queryOrderedByChild("username").queryEqualToValue("\(username!)") 
      .observeEventType(.ChildAdded, withBlock: { snapshot in 

    if snapshot.value.valueForKey("username")! as! String == username! { 

    } else { 

    } 

дерево JSON данные

{ 
    "097ca4a4-563f-4867ghj0-6209288bd7f02" : { 
     "email" : "[email protected]", 
     "uid" : "097ca4a4-563f-4867ghj0-6209288bd7f02", 
     "username" : "test1", 
     "waiting" : "0" 
    }, 
    "55a8f979-ad0d-438u989u69-aa4a-45adb16175e7" : { 
     "email" : "[email protected]", 
     "uid" : "55a8f979-ad0d-438u989u69-aa4a-45adb16175e7", 
     "username" : "test2", 
     "waiting" : "0" 
    } 
} 
+0

«но несмотря на то, если называется еще не дозвонились, когда я хочу» Что вы имеете в виду здесь? – Khuong

+0

@ khuong291 Я имею в виду, что оператор if «активирован»: 'if snapshot.value.valueForKey (« username »)! в виде! String == имя пользователя! {'Но даже если это должно сделать заявление else никогда ничего не делает. –

+0

Правильно, потому что если инструкция истинна, то инструкция else никогда не будет выполняться. – Khuong

ответ

6

Легко исправить:

Не используйте .childAdded как блок не будет выполняться, если запрос не находит ничего.

Вместо этого используйте .Value и проверить NSNull

let checkWaitingRef = Firebase(url:"https://test.firebaseio.com/users") 
    checkWaitingRef.queryOrderedByChild("username").queryEqualToValue("\(username!)") 
       .observeEventType(.Value, withBlock: { snapshot in 

      if (snapshot.value is NSNull) { 
       print("not found)") 

      } else { 
       print(snapshot.value) 
      } 
    } 
+0

Я протестировал этот подход, но функция обратного вызова вызывается несколько раз. Поэтому в разделе вывода я получаю «не найден», а затем значение моментального снимка ... не уверен, как получить только один результат. – franswa

+0

. У вас есть что-то еще не так, поскольку .value считывает все содержимое узла, чтобы оно не было вызывать несколько раз - если вы не модифицируете узел. Вы также можете наблюдатьSingleEventOfType. – Jay

+0

Да, я, должно быть, делал что-то неправильно ... Я провел весь свой вечер, борясь с этим вчера, тьфу, но теперь, похоже, он работает так, как вы говорите. – franswa

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