2016-02-28 2 views
3

Я пытаюсь запросить Firebase, чтобы проверить, есть ли у пользователя waiting: "1", а затем, когда моментальный снимок возвращается, я хочу посмотреть, равно ли оно нулю. Я попытался сделать это, но метод, который я использовал, не работает, и у меня есть только что-то вне, если снимок не равен нулю. Я добавил код, который у меня есть, и текст JSON от Firebase.Проверка того, что моментальный снимок Firebase равен нулю в Swift

import UIKit 
import Firebase 
import Spring 

class GamesViewController: UIViewController { 

let ref = Firebase(url: "https://123test123.firebaseio.com") 
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() 

@IBAction func StartGamePressed(sender: AnyObject) { 
    print("test1") 
    var peopleWaiting: [String] = [] 

    let userRef = Firebase(url:"https://123test123.firebaseio.com/users") 
    userRef.queryOrderedByChild("waiting").queryEqualToValue("1") 
     .observeEventType(.ChildAdded, withBlock: { snapshot in 
      print(snapshot.key) 
      if snapshot.key == nil { 
       print("test2") 
       let userData = ["waiting": "1"] 
       let usersRef = self.ref.childByAppendingPath("users") 
       let hopperRef = usersRef.childByAppendingPath("\(self.ref.authData.uid)") 

       hopperRef.updateChildValues(userData, withCompletionBlock: { 
        (error:NSError?, ref:Firebase!) in 
        if (error != nil) { 
         print("Data could not be saved.") 
         self.displayAlert("Oops!", message: "We have been unable to get you into a game, check you have an internet conection. If this problem carries on contect support") 
        } else { 
         print("Data saved successfully!") 
         let storyboard = UIStoryboard(name: "Main", bundle: nil) 
         let Home : UIViewController = storyboard.instantiateViewControllerWithIdentifier("continueToGame") 
         self.presentViewController(Home, animated: true, completion: nil) 

        } 

       }) 


      } else { 
       var randomUID: String 
       peopleWaiting.append(snapshot.key) 
       let randomIndex = Int(arc4random_uniform(UInt32(peopleWaiting.count))) 
       randomUID = peopleWaiting[randomIndex] 
       print(randomUID) 
       let storyboard = UIStoryboard(name: "Main", bundle: nil) 
       let Home : UIViewController = storyboard.instantiateViewControllerWithIdentifier("continueToGame") 
       self.presentViewController(Home, animated: true, completion: nil) 

      } 
     }) 
} 

func displayAlert(title: String, message: String){ 

    let formEmpty = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
    formEmpty.addAction((UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in 

    }))) 

    self.presentViewController(formEmpty, animated: true, completion: nil) 
} 

func activityIndicatorFunction(){ 

    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 100, 100)) 
    activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1) 
    activityIndicator.layer.cornerRadius = 6 
    activityIndicator.center = self.view.center 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge 
    view.addSubview(activityIndicator) 
    activityIndicator.startAnimating() 
    UIApplication.sharedApplication().beginIgnoringInteractionEvents() 

} 


} 

JSON данных:

{ 
"68e42b7f-aea5-4c3f-b655-51a99cb05bb0" : { 
    "email" : "[email protected]", 
    "username" : "test1", 
    "waiting" : "0" 
}, 
"8503d5a8-fc4a-492b-9883-ec3664898b4f" : { 
    "email" : "[email protected]", 
    "username" : "test2", 
    "waiting" : "0" 
} 
} 
+0

Наверное, ответ ниже. Но, пожалуйста, прочитайте о проблеме [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) (потому что я думаю, что ваш вопрос, возможно, был «как определить, ребенок существует? ») и о том, как построить [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve). Если вы позаботитесь обо всех, нам будет намного легче помочь вам. –

ответ

13

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

Так что если вы хотите проверить, существует ли ребенок в определенном месте, вам необходимо использовать .Value. Как только вы это сделаете, существует множество способов обнаружить существование. Вот один из них:

ref.queryOrderedByChild("waiting").queryEqualToValue("1") 
    .observeEventType(.Value, withBlock: { snapshot in 
     print(snapshot.value) 
     if !snapshot.exists() { 
      print("test2") 
     } 
    }); 
+0

это работает спасибо! :) –

4

Проверка на NSNull. Это код для наблюдения за узлом. Запросы работают одинаково.

Полное и испытанное приложение. Для использования, измените строку «существующий» в какой-то путь, который вы знаете, существует, как ваш путь пользователей и «notexisting» в какой-то путь, который не существует

let myRootRef = Firebase(url:"https://your-app.firebaseio.com") 
    let existingRef = myRootRef.childByAppendingPath("existing") 
    let notExistingRef = myRootRef.childByAppendingPath("notexisting") 

    existingRef.observeEventType(.Value, withBlock: { snapshot in 

     if snapshot.value is NSNull { 
      print("This path was null!") 
     } else { 
      print("This path exists") 
     } 

    }) 

    notExistingRef.observeEventType(.Value, withBlock: { snapshot in 

     if snapshot.value is NSNull { 
      print("This path was null!") 
     } else { 
      print("This path exists") 
     } 

    }) 

Пожалуйста, обратите внимание, что при использовании .Value, будет гарантированный результат возврата, и блок всегда срабатывает. Если ваш код используется .ChildAdded, тогда блок будет срабатывать только тогда, когда ребенок существует.

Также проверьте, как ваши данные отображаются в firebase.

users 
    user_0 
    waiting: 1 

если отличается

users 
    user_0 
    waiting: "1" 

Обратите внимание, что «1» не то же самое, как 1.

+0

Я только что попробовал это, но это не сработало ... @Jay –

+0

Это точно работает! Я обновил свой ответ с помощью полной и проверенной копии и вставленного приложения, которое я только что написал. Если ваш код не работает, значит, что-то еще не так - NSNull - это путь! – Jay

+0

Ну, все, что я знаю, это то, что моя, похоже, не работает, хотя запрос, который вы используете, отличается от моего ... может ли это иметь значение? @Jay –

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