Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пакет SDK политики содержит один класс наблюдателя. Члены наблюдателя являются виртуальными и должны быть переопределены для обработки обратных вызовов для асинхронных операций.
После завершения асинхронной операции вызывается функция-член, OnXxx() соответствующая результату. Примеры: OnLoadSuccess(), OnLoadFailure()и OnAddEngineSuccess() для mip::Profile::Observer.
В приведенных ниже примерах демонстрируется шаблон обещания и будущего, который также используется примерами пакета SDK и может быть расширен для реализации требуемого поведения обратного вызова.
Реализация наблюдателя профилей
В следующем примере мы создали класс, ProfileObserver производный от mip::Profile::Observer. Функции-члены были переопределены для использования шаблона будущего или обещания, используемого во всех примерах.
Примечание: Приведенные ниже примеры частично реализованы и не включают переопределения для mip::ProfileEngine связанных наблюдателей.
profile_observer.h
В заголовке мы определяем ProfileObserver, выводимый из mip::Profile::Observer, а затем переопределяем каждую из функций-членов.
class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
//TODO: Implement remaining members
};
profile_observer.cpp
В самой реализации мы определяем действие для каждой функции-члена наблюдателя.
Каждый член принимает два параметра. Первым является общий указатель на класс, обрабатываемый функцией.
ProfileObserver::OnLoadSuccess может ожидать получить mip::Profile.
ProfileObserver::OnAddEngineSuccess ожидал бы mip::ProfileEngine.
Второй — это общий указатель на контекст. В нашей реализации контекст является ссылкой на std::promise, переданную как shared_ptr<void>. Первая строка функции приводит это значение к типу std::promise, а затем сохраняет его в объекте с именем promise.
Наконец, будущее подготавливается путем настройки promise->set_value() и передачи объекта mip::Profile.
#include "profile_observer.h"
#include <future>
//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
//set promise value to profile
promise->set_value(profile);
}
//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
promise->set_exception(error);
}
//TODO: Implement remaining observer members
При выполнении любой асинхронной операции реализация наблюдателя передается конструктору параметров или асинхронной функции.