public static async Task <T> Listen <T>(DatabaseReference db, string key, FirebaseEventType eventType, int timeout = 30000) { var result = default(T); void handler(object o, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } if (key == args.Snapshot.Key) { switch (eventType) { case FirebaseEventType.Added: db.ChildAdded -= handler; break; case FirebaseEventType.Changed: db.ChildChanged -= handler; break; default: throw new ArgumentOutOfRangeException(nameof(eventType), eventType, null); } //Debug.Log( args.Snapshot.GetRawJsonValue().Replace("{", Environment.NewLine + "{")); result = JsonConvert.DeserializeObject <T>(args.Snapshot.GetRawJsonValue()); Debug.Log(JsonConvert.SerializeObject(result, Formatting.Indented)); } } switch (eventType) { case FirebaseEventType.Added: db.ChildAdded += handler; break; case FirebaseEventType.Changed: db.ChildChanged += handler; break; default: throw new ArgumentOutOfRangeException(nameof(eventType), eventType, null); } var elapsed = 0; const int increment = 200; while (result == null) { await Task.Delay(increment); elapsed += increment; if (elapsed > timeout) { Debug.LogError("Timed out while listening for new battle context"); return(default(T)); } } return(result); }
/// <summary> /// Initializes a new instance of the <see cref="FirebaseEvent{T}"/> class. /// </summary> /// <param name="key"> The key of the object. </param> /// <param name="obj"> The object. </param> /// <param name="eventType"> The event type. </param> public FirebaseEvent(string key, T obj, FirebaseEventType eventType, FirebaseEventSource eventSource) : base(key, obj) { this.EventType = eventType; this.EventSource = eventSource; }