Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пакет SDK для файлов содержит два класса наблюдателя. Члены наблюдателя являются виртуальными и могут быть переопределены для обработки обратных вызовов событий.
После завершения асинхронной операции вызывается функция-член, OnXxx() соответствующая результату. Примеры: OnLoadSuccess(), OnLoadFailure()и OnAddEngineSuccess() для mip::FileProfile::Observer.
Эти примеры демонстрируют шаблон Promise/Future, который также используется в примерах SDK и может быть расширен для реализации нужного поведения функции обратного вызова.
Реализация наблюдателя профилей файлов
В следующем примере мы создали класс, ProfileObserver производный от mip::FileProfile::Observer. Функции-члены были переопределены для использования паттерна future/promise, применяемого во всех примерах.
Примечание: Примеры реализованы лишь частично и не включают переопределения для наблюдателей, связанных с mip::FileEngine.
profile_observer.h
В заголовке мы определяем ProfileObserver, производные от mip::FileProfile::Observer, а затем переопределяем каждую из функций-членов.
class ProfileObserver final : public mip::FileProfile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) override;
void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
//TODO: Implement mip::FileEngine related observers.
};
profile_observer.cpp
В самой реализации мы задаём, какое действие выполнять для каждой функции-члена наблюдателя.
Каждый член принимает два параметра. Первым является общий указатель на класс, который мы обрабатываем в функции.
ProfileObserver::OnLoadSuccess Ожидается, что он получит mip::FileProfile.
ProfileObserver::OnAddEngineSuccess можно было бы ожидать mip::FileEngine.
Второй — это общий указатель на контекст. В нашей реализации контекст — это ссылка на std::promise, передаваемая по ссылке как std::shared_ptr<void>. Первая строка функции приводит this к std::promise, а затем сохраняет результат в объекте с именем promise.
Наконец, будущее готово, задав promise->set_value() и передав объект mip::FileProfile .
#include "profile_observer.h"
#include <future>
//Called when FileProfile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise =
std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileProfile>>>(context);
//set promise value to profile
promise->set_value(profile);
}
//Called when FileProfile 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::FileProfile>>>(context);
promise->set_exception(error);
}
//TODO: Implement mip::FileEngine related observers.
При создании экземпляра любого класса SDK или использовании функции, выполняющей асинхронные операции, мы передаем реализацию наблюдателя конструктору параметров или асинхронной функции. При создании экземпляра объекта mip::FileProfile::Settings конструктор принимает mip::FileProfile::Observer в качестве одного из параметров. В этом примере показан наш пользовательский ProfileObserver, используемый в конструкторе mip::FileProfile::Settings.
Реализация наблюдателя для FileHandler
Подобно наблюдателю профиля, mip::FileHandler реализует класс mip::FileHandler::Observers для обработки асинхронных уведомлений о событиях при операциях с файлами. Реализация аналогична описанной выше.
FileHandlerObserver частично определен ниже.
file_handler_observer.h
#include "mip/file/file_handler.h"
class FileHandlerObserver final : public mip::FileHandler::Observer {
public:
void OnCreateFileHandlerSuccess(
const std::shared_ptr<mip::FileHandler>& fileHandler,
const std::shared_ptr<void>& context) override;
void OnCreateFileHandlerFailure(
const std::exception_ptr& error,
const std::shared_ptr<void>& context) override;
//TODO: override remaining member functions inherited from mip::FileHandler::Observer
};
file_handler_observer.cpp
Этот пример содержит только первые две функции, но остальные функции используют аналогичный шаблон, как и эти функции, и как в ProfileObserver.
#include "file_handler_observer.h"
void FileHandlerObserver::OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
promise->set_value(fileHandler);
}
void FileHandlerObserver::OnCreateFileHandlerFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
promise->set_exception(error);
}
//TODO: override remaining member functions inherited from mip::FileHandler::Observer