Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O SDK de Arquivo contém duas classes de observador. Você pode substituir os membros do observador virtual para lidar com retornos de chamada de evento.
Quando uma operação assíncrona é concluída, o SDK chama a OnXxx() função membro que corresponde ao resultado. Exemplos são OnLoadSuccess(), OnLoadFailure()e OnAddEngineSuccess() para mip::FileProfile::Observer.
Esses exemplos demonstram o padrão de promessa/futuro. Os exemplos do SDK também usam esse padrão e você pode estendê-lo para implementar o comportamento de retorno de chamada desejado.
Implementação do observador de perfil de arquivo
O exemplo a seguir cria uma classe, ProfileObserverque deriva de mip::FileProfile::Observer. As funções de membro substituem a classe base para usar o padrão futuro/promessa usado em todas as amostras.
Note
Os exemplos implementam apenas parte da classe de observador e não incluem substituições para os observadores relacionados mip::FileEngine.
profile_observer.h
O cabeçalho define ProfileObserver, deriva-o de mip::FileProfile::Observer e, em seguida, sobrescreve 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
A implementação define uma ação a ser tomada para cada função de membro do observador.
Cada membro aceita dois parâmetros. O primeiro é um ponteiro compartilhado para a classe que a função manipula.
ProfileObserver::OnLoadSuccess espera receber um mip::FileProfile.
ProfileObserver::OnAddEngineSuccess espera mip::FileEngine.
O segundo é um ponteiro compartilhado para o contexto. Nessa implementação, o contexto é uma referência a um std::promise, passado por referência na forma de std::shared_ptr<void>. A primeira linha da função converte esse valor em std::promise, em seguida, armazena-o em um objeto chamado promise.
Por fim, o código prepara o futuro definindo promise->set_value() e passando o mip::FileProfile objeto.
#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.
Ao instanciar qualquer classe SDK ou usar uma função que executa operações assíncronas, passe a implementação do observador para o construtor de configurações ou a função assíncrona em si. Quando você cria uma instância do mip::FileProfile::Settings objeto, o construtor aceita mip::FileProfile::Observer como um dos parâmetros. Este exemplo mostra o ProfileObserver personalizado, usado em um construtor mip::FileProfile::Settings.
Implementação do observador FileHandler
Semelhante ao observador de perfil, mip::FileHandler implementa uma mip::FileHandler::Observer classe para lidar com notificações de evento assíncronas durante operações de arquivo. A implementação é semelhante à implementação anterior. O exemplo a seguir 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 exemplo inclui apenas as duas primeiras funções, mas as funções restantes usam um padrão semelhante a essas funções e para 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
Próximas Etapas
- Conheça o exemplo em C++ do MIP File SDK no GitHub.