示例#1
0
    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);
    }
示例#2
0
 /// <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;
 }