Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
SDK plików zawiera dwie klasy obserwatorów. Członkowie klasy obserwatora są wirtualni i mogą być zastępowani w celu obsługi wywołań zwrotnych zdarzeń.
Po zakończeniu OnXxx() operacji asynchronicznej wywoływana jest funkcja składowa odpowiadająca wynikowi. Przykłady to OnLoadSuccess(), OnLoadFailure()i OnAddEngineSuccess() dla .mip::FileProfile::Observer
W tych przykładach pokazano wzorzec obietnicy/przyszłości, który jest również stosowany w przykładach z zestawu SDK i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.
Implementacja obserwatora profilu pliku
W poniższym przykładzie utworzyliśmy klasę, ProfileObserver która pochodzi z mip::FileProfile::Observerklasy . Funkcje składowe zostały nadpisane w celu użycia wzorca przyszłości/obietnicy, stosowanego w całych przykładach.
Uwaga: Przykłady są zaimplementowane tylko częściowo i nie zawierają nadpisania dla powiązanych mip::FileEngine obserwatorów.
profile_observer.h
W nagłówku definiujemy ProfileObserver, wyprowadzając z mip::FileProfile::Observer, a następnie przesłaniamy poszczególne funkcje składowe.
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
W samej implementacji definiujemy akcję, która ma być wykonywana dla każdej funkcji składowej obserwatora.
Każdy członek akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, którą obsługujemy w funkcji.
ProfileObserver::OnLoadSuccess oczekuje się, że otrzyma element mip::FileProfile.
ProfileObserver::OnAddEngineSuccess oczekiwałoby mip::FileEngine.
Drugi to wskaźnik współużytkowany do kontekstu. W naszej implementacji kontekst jest odwołaniem do std::promise, przekazywanym jako std::shared_ptr<void>. Pierwszy wiersz funkcji rzutuje to na std::promise, a następnie jest przechowywane w obiekcie o nazwie promise.
Na koniec przyszłość zostaje przygotowana poprzez ustawienie promise->set_value() i przekazanie obiektu 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.
Gdy tworzymy wystąpienie dowolnej klasy zestawu SDK lub używamy funkcji wykonującej operacje asynchroniczne, przekazujemy implementację obserwatora do konstruktora ustawień lub samej funkcji asynchronicznej. Podczas tworzenia obiektu mip::FileProfile::Settings, konstruktor przyjmuje mip::FileProfile::Observer jako parametr. W tym przykładzie pokazano naszą niestandardową ProfileObserver, używaną w konstruktorze mip::FileProfile::Settings.
Implementacja obserwatora programu FileHandler
Podobnie jak obserwator profilu, mip::FileHandler implementuje klasę mip::FileHandler::Observers do obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji na plikach. Implementacja jest podobna do powyższej.
FileHandlerObserver jest częściowo zdefiniowany poniżej.
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 to tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych 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