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); }
/// <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); }
/// <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(); }