Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De Bestands-SDK bevat twee waarnemersklassen. Waarnemerleden zijn virtueel en kunnen worden overschreven om callbacks van gebeurtenissen af te handelen.
Wanneer een asynchrone bewerking is voltooid, wordt de OnXxx() lidfunctie die overeenkomt met het resultaat aangeroepen. Voorbeelden zijn OnLoadSuccess(), OnLoadFailure()en OnAddEngineSuccess() voor mip::FileProfile::Observer.
In deze voorbeelden wordt het promise/future-patroon gedemonstreerd, dat ook wordt gebruikt door de SDK-voorbeelden en kan worden uitgebreid om het gewenste callbackgedrag te implementeren.
Implementatie van de bestandsprofiel-observer
In het volgende voorbeeld hebben we een klasse gemaakt die ProfileObserver is afgeleid van mip::FileProfile::Observer. De memberfuncties zijn geherdefinieerd om het future/promise-patroon te gebruiken dat in alle voorbeelden wordt gebruikt.
Opmerking: De voorbeelden zijn maar gedeeltelijk geïmplementeerd en bevatten geen overschrijvingen voor de mip::FileEngine gerelateerde waarnemers.
profile_observer.h
In de koptekst definiëren we ProfileObserver, afgeleid van mip::FileProfile::Observer, en overschrijven we vervolgens elk van de lidfuncties.
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
In de implementatie zelf definiëren we een actie die moet worden uitgevoerd voor elke waarnemersfunctie.
Elk lid accepteert twee parameters. De eerste is een gedeelde aanwijzer naar de klasse die we in de functie verwerken.
ProfileObserver::OnLoadSuccess zou verwachten een mip::FileProfile te ontvangen.
ProfileObserver::OnAddEngineSuccess zou verwachten mip::FileEngine.
De tweede is een gedeelde aanwijzer naar de context. In onze implementatie is de context een verwijzing naar een std::promise, doorgegeven door verwijzing als std::shared_ptr<void>. De eerste regel van de functie cast dit naar std::promise, waarna het wordt opgeslagen in een object genaamd promise.
Ten slotte wordt de toekomst gereed gemaakt door promise->set_value() in te stellen en het mip::FileProfile-object door te geven.
#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.
Wanneer we een SDK-klasse instantiëren of een functie gebruiken die asynchrone bewerkingen uitvoert, geven we de waarnemers-implementatie door aan de instellingenconstructor of asynchrone functie zelf. Bij het instantiëren van het mip::FileProfile::Settings object accepteert de constructor mip::FileProfile::Observer als een van de parameters. In dit voorbeeld ziet u de aangepaste ProfileObserver, die wordt gebruikt in een mip::FileProfile::Settings constructor.
Implementatie van de FileHandler-observer
Net als de profielwaarnemer implementeert de mip::FileHandler een mip::FileHandler::Observers-klasse voor het afhandelen van asynchrone gebeurteniskennisgevingen tijdens bestandsbewerkingen. De implementatie is vergelijkbaar met die hierboven beschreven.
FileHandlerObserver is gedeeltelijk gedefinieerd hieronder.
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
Dit voorbeeld toont slechts de eerste twee functies, maar de resterende functies gebruiken een vergelijkbaar patroon als deze en 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