public static RemoteDataChange Create(string FullPath,
                                              string FieldName,
                                              object FieldValue,
                                              Action <RemoteDataChange> ApplyCallback)
        {
            var change = ClassPool.SpawnOrCreate(() => new RemoteDataChange());

            change.FullPath      = FullPath;
            change.FieldName     = FieldName;
            change.FieldValue    = FieldValue;
            change.ApplyCallback = ApplyCallback;
            return(change);
        }
Exemple #2
0
        /// <summary>
        /// WARNING complex types for field values not supported
        /// </summary>
        /// <param name="changes"></param>
        /// <returns></returns>
        public override async Task PerformBatchUpdate(IEnumerable <RemoteDataChange> changes)
        {
            var changeDictionary = ClassPool.SpawnOrCreate <Dictionary <string, object> >(() => new Dictionary <string, object>());

            foreach (var change in changes)
            {
                changeDictionary.Add(change.FullPath, change.FieldValue);
            }
            var rootRef = FirebaseDatabase.DefaultInstance.RootReference;
            await rootRef.UpdateChildrenAsync(changeDictionary);

            foreach (var change in changes)
            {
                change.ApplyCallback?.Invoke(change);
                change.Dispose();
            }
            ClassPool.Despawn <Dictionary <string, object> >(changeDictionary, null);
        }
Exemple #3
0
        /// <summary>
        /// Отправляет все локально записанные изменения на сервер.
        /// ВАЖНО: все операции в рамках одной комманды не должны прерыватья вызовом
        /// метода
        /// </summary>
        /// <returns></returns>
        public async Task CommitChanges()
        {
            var updateTasks = ClassPool.SpawnOrCreate <List <Task> >(() => new List <Task>());
            List <RemoteDataChange> changes;

            lock (_pendingChanges)
            {
                changes = _pendingChanges.ToList();
                _pendingChanges.Clear();
            }

            foreach (var change in changes)
            {
                updateTasks.Add(_objectHandler.ApplyChange(change));
            }
            await Task.WhenAll(updateTasks.ToArray());

            changes.ForEach((ch) => ch.Dispose());
            changes.Clear();
        }