Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
SDK plików zawiera dwie klasy obserwatorów. Można zastąpić członków obserwatora wirtualnego w celu obsługi wywołań zwrotnych zdarzeń.
Po zakończeniu operacji asynchronicznej zestaw SDK wywołuje OnXxx() funkcję składową odpowiadającą wynikowi. Przykłady to OnLoadSuccess(), OnLoadFailure()i OnAddEngineSuccess() dla .mip::FileProfile::Observer
Te przykłady pokazują wzorzec obietnicy/przyszłości. Przykłady zestawu SDK używają również tego wzorca i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.
Implementacja obserwatora File Profile
Poniższy przykład tworzy klasę , ProfileObserverktóra pochodzi z klasy mip::FileProfile::Observer. Funkcje składowe zastępują klasę bazową, aby używać wzorca przyszłości/obietnicy używanego w próbkach.
Note
Przykłady implementują tylko część klasy obserwatora i nie zawierają przesłonięć dla obserwatorów powiązanych z mip::FileEngine.
profile_observer.h
Nagłówek definiuje ProfileObserver, wyprowadza go z mip::FileProfile::Observer, a następnie przesłania każdą z funkcji składowych.
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
Implementacja definiuje działanie wykonywane dla każdej funkcji składowej obserwatora.
Każdy członek akceptuje dwa parametry. Pierwszy to współdzielony wskaźnik do klasy obsługiwanej przez funkcję.
ProfileObserver::OnLoadSuccess oczekuje, że otrzyma element mip::FileProfile.
ProfileObserver::OnAddEngineSuccess oczekuje mip::FileEngine.
Drugi to wskaźnik współużytkowany do kontekstu. W tej implementacji kontekst to odwołanie do std::promise, przekazywane przez odwołanie jako std::shared_ptr<void>. Pierwszy wiersz funkcji rzutuje tę wartość na std::promise, a następnie przechowuje ją w obiekcie o nazwie promise.
Na koniec kod sprawia, że przyszłość jest gotowa, ustawiając promise->set_value() i przekazując mip::FileProfile obiekt.
#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.
Gdy tworzysz instancję dowolnej klasy SDK lub używasz funkcji wykonującej operacje asynchroniczne, przekaż implementację obserwatora do konstruktora klasy Settings lub do samej funkcji async. Gdy tworzysz instancję obiektu mip::FileProfile::Settings, konstruktor przyjmuje mip::FileProfile::Observer jako jeden z parametrów. Ten przykład pokazuje niestandardowy element ProfileObserver, użyty w konstruktorze mip::FileProfile::Settings.
Implementacja obserwatora programu FileHandler
Podobnie jak obserwator profilu, mip::FileHandler implementuje klasę mip::FileHandler::Observer do obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji na plikach. Implementacja jest podobna do poprzedniej implementacji. Poniższy przykład częściowo definiuje element 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
Ten przykład obejmuje tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych funkcji i do 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
Następne kroki
- Zapoznaj się z przykładem zestawu MIP File SDK C++ w GitHub.