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. Beobachtermitglieder sind virtuell und können überschrieben werden, um Ereignisrückrufe zu behandeln.
Nach Abschluss eines asynchronen Vorgangs wird die dem Ergebnis entsprechende OnXxx()-Memberfunktion aufgerufen. Beispiele sind OnLoadSuccess(), OnLoadFailure()und OnAddEngineSuccess() für mip::FileProfile::Observer.
Diese 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 so überschrieben, dass sie das in allen Beispielen verwendete Future/Promise-Muster nutzen.
Hinweis: Die Beispiele sind nur teilweise implementiert und enthalten keine Überschreibungen für die zu mip::FileEngine gehörenden Observer.
profile_observer.h
Im Header definieren wir ProfileObserver, das von mip::FileProfile::Observer abgeleitet ist, 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 Beobachtermitgliedsfunktion zu ergreifen ist.
Jedes Mitglied 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 erwartet mip::FileEngine.
Der zweite ist ein gemeinsamer Zeiger auf den Kontext. In unserer Implementierung ist der Kontext ein Verweis auf einen std::promise, der als Verweis std::shared_ptr<void>übergeben wird. Die erste Zeile der Funktion wandelt dies in std::promise um und speichert es dann in einem Objekt namens promise.
Abschließend wird das Future vorbereitet, indem promise->set_value() festgelegt und das mip::FileProfile-Objekt ü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 nimmt der Konstruktor mip::FileProfile::Observer als einen der Parameter entgegen. Dieses Beispiel zeigt unsere benutzerdefinierte ProfileObserver, die 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 ist 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 umfasst nur die ersten beiden Funktionen, aber die verbleibenden Funktionen folgen einem ähnlichen Muster wie diese beiden 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