Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O File SDK contém duas classes de observadores. Os membros observadores são virtuais e podem ser substituídos para lidar com funções de retorno de eventos.
Quando uma operação assíncrona é concluída, a OnXxx() função de membro correspondente ao resultado é chamada. Exemplos são OnLoadSuccess(), OnLoadFailure(), e OnAddEngineSuccess() para mip::FileProfile::Observer.
Esses exemplos demonstram o padrão promise/future, que também é usado pelos exemplos do SDK e pode ser estendido para implementar o comportamento de retorno de chamada desejado.
Implementação do File Profile Observer
No exemplo a seguir, criamos uma classe, ProfileObserver que é derivada de mip::FileProfile::Observer. As funções de membro foram substituídas para usar o padrão futuro/promessa usado em todas as amostras.
Nota: As amostras são apenas parcialmente implementadas e não incluem sobreposições para os mip::FileEngine observadores associados.
profile_observer.h
No cabeçalho, definimos ProfileObserver, derivando de mip::FileProfile::Observer, e em seguida, substituímos cada uma das funções membro.
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
Na implementação em si, definimos uma ação a ser tomada para cada função de membro observador.
Cada membro aceita dois parâmetros. O primeiro é um ponteiro partilhado para a classe na qual estamos a lidar na função.
ProfileObserver::OnLoadSuccess esperaria receber um mip::FileProfile.
ProfileObserver::OnAddEngineSuccess esperaria mip::FileEngine.
O segundo é um ponteiro partilhado para o contexto. Em nossa implementação, o contexto é uma referência a um std::promise, passado por referência como std::shared_ptr<void>. A primeira linha da função converte isto para std::promise, e, em seguida, é armazenada em um objeto chamado promise.
Finalmente, o futuro é preparado definindo o promise->set_value() e passando o 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.
Quando instanciamos qualquer classe SDK ou usamos uma função que executa operações assíncronas, passamos a implementação do observador para o construtor de configurações ou para a própria função assíncrona. Ao instanciar o mip::FileProfile::Settings objeto, o construtor assume mip::FileProfile::Observer como um dos parâmetros. Este exemplo mostra nosso personalizado ProfileObserver, usado em um mip::FileProfile::Settings construtor.
Implementação do FileHandler Observer
Semelhante ao observador de perfil, o mip::FileHandler implementa uma mip::FileHandler::Observers classe para manipular notificações de eventos assíncronos durante operações de arquivo. A implementação é semelhante à descrita acima.
FileHandlerObserver é parcialmente definida abaixo.
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 exemplo é apenas as duas primeiras funções, mas as funções restantes usam um padrão semelhante a estas e 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