Ответ был прост. Я не знал о разрешениях по умолчанию для баз данных реального времени firebase. Разрешения по умолчанию:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
{
"rules": {
".read": true,
".write": true
}
}
Но если я хочу попробовать выполнить http-запрос во время разработки, я могу изменить разрешения на:
{
"rules": {
".read": true,
".write": true
}
}
Вы можете изменить это в раздел базы данных firebase -> rules
Я получил ответ благодаря этому сообщению Отказано в разрешении Firebase
Я заново продумал бы Ваш дизайн немного.
При реализации обработки в базовом классе Вы могли бы разделить ее на подклассы с 2 альтернативами, которые были бы почти interchangable.
Первое могло быть похожим на Ваш, где это берет Операцию, которая возвращает значение. (Я переделал бы это для использования Func<T>
вместо того, чтобы иметь Ваш собственный тип делегата, все же.
Второе могло просто принять простые Меры и не обеспечить возвращаемое значение. Оба могли использовать ту же анимацию/дисплей/и т.д. стандартные программы, но обеспечивают другой способ работать. Вы могли также выдать это к другим методам с помощью базового класса, который обеспечит большую гибкость.
С этим подходом Вы могли назвать это как:
private void DoSleep()
{
Thread.CurrentThread.Sleep(5000);
}
private int ReturnSleep()
{
Thread.CurrentThread.Sleep(5000);
return 5000;
}
...
{
var actionWindow = new OperatingWindowAction(this.DoSleep);
actionWindow.Execute();
var funcWindow = new OperatingWindowFunc<int>(this.ReturnSleep);
funcWindow.Execute();
int result = funcWindow.Result;
}
Это посмотрело бы что-то как:
public abstract partial class OperatingWindowBase : Form
{
public void Execute()
{
// call this.OnExecute(); asyncronously so you can animate
}
protected abstract void OnExecute();
}
public class OperatingWindowFunc<T> : OperatingWindowBase
{
Func<T> operation;
public T Result { get; private set; }
public OperatingWindowFunc<T>(Func<T> operation)
{
this.operation = operation;
}
protected override OnExecute()
{
this.Result = operation();
}
}
public class OperatingWindowAction
{
Action operation;
public OperatingWindow(Action operation)
{
this.operation = operation;
}
protected override OnExecute()
{
operation();
}
}
Нет, необходимо будет создать перегрузку, чтобы сделать это.
например.
public operatingWindow(Action action)
{
m_Operation=() => { action(); return null; }
}
Также Вы не должны определять своего собственного делегата, можно использовать Func<T>
и Действие.