Callback для нескольких результатов

Для реализации callback'а с несколькими (возможно, асинхронными) результатами в MBSL реализован класс MBSL_MultiPromisedResultCallback. Ниже приведён список основных методов данного класса:

class MBSL_MultiPromisedResultCallback : Managed
{
	//ScriptCaller must provide the callback destination and follow signature func(array<ref Managed> results)
	static MBSL_MultiPromisedResultCallback Make(ScriptCaller callback);
	void PromiseResult();
	void ProvideResult(Managed data);
	void BeginAwait();
}

Метод Make принимает один аргумент callback - ScriptCaller, указывающий на метод, который будет вызван, когда класс получит все результаты. Метод должен принимать один аргумент - массив сильных ссылок на класс Managed (array<ref Managed>). Make используется для создания экземпляра класса, при этом система сама будет держать сильную ссылку на этот экземпляр, пока он не получит все результаты и не вызовет callback.

Метод PromiseResult сообщает классу, что он должен ждать ещё один дополнительный результат, прежде чем вызвать callback.

Метод ProvideResult передаёт классу один результат.

Метод BeginAwait начинает ожидание результатов. Он должен быть вызван после всех вызовов PromiseResult.

Ниже приведён пример использования данного класса:

class Test : Managed
{
    int a;
}

MBSL_MultiPromisedResultCallback callback = MBSL_MultiPromisedResultCallback.Make(ScriptCaller.Create(OnResultsReady));
CreateResultWithDelay(callback, 500);
CreateResultWithDelay(callback, 1200);
callback.BeginAwait();

void CreateResultWithDelay(MBSL_MultiPromisedResultCallback receiver, int delay)
{
    receiver.PromiseResult();
    GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ProvideDelayedResult, delay, false, receiver);
}

void ProvideDelayedResult(MBSL_MultiPromisedResultCallback receiver)
{
    Test t = new Test();
    t.a = 3;
    receiver.ProvideResult(t);
}

void OnResultsReady(array<ref Managed> results) //Будет вызван через 1200 мс
{
    Test t;
    foreach (Managed m : results)
    {
        CastTo(t, m);
        Print(t.a);
    }
    //Вывод:
    //3
    //3
}

Last updated