Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El SDK de archivo contiene dos clases de observador. Puede anular los miembros del observador virtual para administrar las devoluciones de llamada de eventos.
Cuando se completa una operación asincrónica, el SDK llama a la OnXxx() función miembro que corresponde al resultado. Algunos ejemplos son OnLoadSuccess(), OnLoadFailure()y OnAddEngineSuccess() para mip::FileProfile::Observer.
Estos ejemplos muestran el patrón de promesa y futuro. Los ejemplos del SDK también usan este patrón y puede ampliarlo para implementar el comportamiento de devolución de llamada deseado.
Implementación del observador de perfiles de archivo
En el ejemplo siguiente se crea una clase , ProfileObserver, que deriva de mip::FileProfile::Observer. Las funciones miembro sobrescriben las de la clase base para usar el patrón future/promise utilizado en todos los ejemplos.
Note
Los ejemplos implementan solo parte de la clase observadora y no incluyen redefiniciones para los observadores relacionados con mip::FileEngine.
profile_observer.h
El encabezado define ProfileObserver, lo deriva de mip::FileProfile::Observery, a continuación, invalida cada una de las funciones miembro.
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
La implementación define una acción que se va a realizar para cada función miembro del observador.
Cada miembro acepta dos parámetros. El primero es un puntero compartido a la clase que administra la función.
ProfileObserver::OnLoadSuccess espera recibir un mip::FileProfile.
ProfileObserver::OnAddEngineSuccess espera mip::FileEngine.
El segundo es un puntero compartido al contexto. En esta implementación, el contexto es una referencia a std::promise, que se pasa por referencia como std::shared_ptr<void>. La primera línea de la función convierte este valor std::promiseen y, a continuación, la almacena en un objeto denominado promise.
Por último, el código deja preparado el futuro estableciendo promise->set_value() y pasando el objeto 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.
Al crear instancias de cualquier clase de SDK o usar una función que realiza operaciones asincrónicas, pase la implementación del observador al constructor de configuración o a la propia función asincrónica. Al crear una instancia del mip::FileProfile::Settings objeto, el constructor acepta mip::FileProfile::Observer como uno de los parámetros. Este ejemplo muestra el elemento personalizado ProfileObserver, usado en un constructor mip::FileProfile::Settings.
Implementación del observador de FileHandler
De forma similar al observador de perfiles, mip::FileHandler implementa una mip::FileHandler::Observer clase para controlar las notificaciones de eventos asincrónicas durante las operaciones de archivo. La implementación es similar a la implementación anterior. En el ejemplo siguiente se define FileHandlerObserverparcialmente .
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
Este ejemplo incluye solo las dos primeras funciones, pero las funciones restantes usan un patrón similar a estas funciones y a 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
Pasos siguientes
- Explore el ejemplo de C++ del SDK de archivos MIP en GitHub.