Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das File SDK enthält zwei Beobachterklassen. Beobachter-Member sind virtuell und können überschrieben werden, um Ereignisrückrufe zu behandeln.
Wenn ein asynchroner Vorgang abgeschlossen wird, wird die OnXxx()-Memberfunktion, die dem Ergebnis entspricht, genannt. Beispiele sind OnLoadSuccess(), OnLoadFailure(), und OnAddEngineSuccess() für mip::FileProfile::Observer.
Die folgenden Beispiele veranschaulichen das zugesagte/zukünftige Muster, das auch von den SDK-Beispielen verwendet wird, und kann erweitert werden, um das gewünschte Rückrufverhalten zu implementieren.
Implementierung des Dateiprofilbeobachters
Im folgenden Beispiel haben wir eine Klasse erstellt, ProfileObserver die von mip::FileProfile::Observer abgeleitet ist. Die Memberfunktionen wurden überschrieben, um das in den Beispielen verwendete Zukünftige/Zusagemuster zu verwenden.
Hinweis: Die folgenden Beispiele sind nur teilweise implementiert und enthalten keine Außerkraftsetzungen für die mip::FileEngine zugehörigen Beobachter.
profile_observer.h
In der Kopfzeile definieren wir ProfileObserver, abgeleitet von mip::FileProfile::Observer, und überschreiben dann jede der Memberfunktionen.
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 der Implementierung selbst definieren wir eine Aktion, die für jede Beobachter-Memberfunktion zu ergreifen ist.
Jedes Member akzeptiert zwei Parameter. Der erste ist ein gemeinsamer Zeiger auf die Klasse, die wir in der Funktion behandeln. ProfileObserver::OnLoadSuccess würde erwarten, ein mip::FileProfile zu erhalten. ProfileObserver::OnAddEngineSuccess würde mip::FileEngine erwarten.
Die zweite ist ein freigegebener Zeiger auf den Kontext. In unserer Implementierung ist der Kontext ein Verweis auf einen std::promise, der als Verweis als std::shared_ptr<void> übergeben wird. Die erste Zeile der Funktion überträgt dies nach std::promise und wird dann in einem Objekt gespeichert, das promise heißt.
Letztendlich wird die Zukunft vorbereitet, indem das promise->set_value()-Objekt festgelegt und mip::FileProfile übergeben wird.
#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.
Wenn wir eine SDK-Klasse instanziieren oder eine Funktion verwenden, die asynchrone Vorgänge ausführt, übergeben wir die Beobachterimplementierung an den Einstellungskonstruktor oder die asynchrone Funktion selbst. Beim Instanziieren des mip::FileProfile::Settings-Objekts verwendet der Konstruktor mip::FileProfile::Observer als einen der Parameter. Das folgende Beispiel zeigt unser benutzerdefiniertes ProfileObserver, das in einem mip::FileProfile::Settings-Konstruktor verwendet wird.
FileHandler-Observer-Implementierung
Ähnlich wie der Profilbeobachter implementiert mip::FileHandler die mip::FileHandler::Observers-Klasse zum Behandeln asynchroner Ereignisbenachrichtigungen während Dateivorgängen. Die Implementierung ähnelt dem oben Beschriebenen. FileHandlerObserver wird teilweise unten definiert.
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
Dieses Beispiel ist nur die ersten beiden Funktionen, die übrigen Funktionen jedoch verwenden ein ähnliches Muster wie diese und wie 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