Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
File SDK contiene due classi observer. È possibile eseguire l'override dei membri dell'osservatore virtuale per gestire i callback degli eventi.
Al termine di un'operazione asincrona, l'SDK chiama la OnXxx() funzione membro che corrisponde al risultato. Gli esempi sono OnLoadSuccess(), OnLoadFailure()e OnAddEngineSuccess() per mip::FileProfile::Observer.
Questi esempi illustrano il modello promise/future. Gli esempi dell'SDK usano anche questo modello ed è possibile estenderlo per implementare il comportamento di callback desiderato.
Implementazione dell'osservatore del profilo file
Nell'esempio seguente viene creata una classe , ProfileObserver, che deriva da mip::FileProfile::Observer. Le funzioni membro eseguono l'override della classe base per usare il modello futuro/promessa usato in tutti gli esempi.
Note
Gli esempi implementano solo parte della classe observer e non includono override per gli mip::FileEngine osservatori correlati.
profile_observer.h
L'intestazione definisce ProfileObserver, la deriva da mip::FileProfile::Observer, quindi esegue l'override di ognuna delle funzioni membro.
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
L'implementazione definisce un'azione da eseguire per ogni funzione membro osservatore.
Ogni membro accetta due parametri. Il primo è un puntatore condiviso alla classe gestita dalla funzione.
ProfileObserver::OnLoadSuccess si aspetta di ricevere un mip::FileProfile.
ProfileObserver::OnAddEngineSuccess si aspetta mip::FileEngine.
Il secondo è un puntatore condiviso al contesto. In questa implementazione, il contesto è un riferimento a un std::promise, passato per riferimento come std::shared_ptr<void>. La prima riga della funzione esegue il cast di questo valore su std::promise, quindi la archivia in un oggetto denominato promise.
Infine, il codice rende il futuro pronto impostando promise->set_value() e passando l'oggetto 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.
Quando si crea un'istanza di qualsiasi classe SDK o si usa una funzione che esegue operazioni asincrone, passare l'implementazione dell'osservatore al costruttore delle impostazioni o alla funzione asincrona stessa. Quando si crea un'istanza dell'oggetto mip::FileProfile::Settings , il costruttore accetta mip::FileProfile::Observer come uno dei parametri. Questo esempio mostra l'elemento personalizzato ProfileObserver, usato in un costruttore mip::FileProfile::Settings.
Implementazione dell'osservatore FileHandler
Analogamente all'osservatore del profilo, mip::FileHandler implementa una mip::FileHandler::Observer classe per la gestione delle notifiche di eventi asincrone durante le operazioni sui file. L'implementazione è simile all'implementazione precedente. L'esempio seguente definisce FileHandlerObserverparzialmente .
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
Questo esempio include solo le prime due funzioni, ma le funzioni rimanenti usano un modello simile a queste funzioni e a 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
Passaggi successivi
- Esplorare l'esempio C++ di MIP File SDK in GitHub.