Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Sada File SDK obsahuje dvě třídy pozorovatele. Členové pozorovatele jsou virtuální a je možné je přepsat za účelem zpracování zpětných volání událostí.
Po dokončení asynchronní operace je volána členská funkce OnXxx(), která odpovídá výsledku. Příklady jsou OnLoadSuccess(), OnLoadFailure(), a OnAddEngineSuccess() pro mip::FileProfile::Observer.
Tyto příklady demonstrují model příslibu a budoucnosti, který také používají ukázky sady SDK, a lze je rozšířit, aby implementoval požadované chování zpětného volání.
Implementace pozorovatele profilu souborů
V následujícím příkladu jsme vytvořili třídu, ProfileObserver která je odvozena z mip::FileProfile::Observer. Členské funkce byly přepsány tak, aby používaly vzor future/promise použitý v celých příkladech.
Poznámka: Ukázky jsou implementovány pouze částečně a nezahrnují úpravy u mip::FileEngine souvisejících pozorovatelů.
profile_observer.h
V hlavičce definujeme ProfileObserver, odvozenou z mip::FileProfile::Observer, a poté přepíšeme každou z členských funkcí.
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
V samotné implementaci definujeme akci pro každou funkci člena pozorovatele.
Každý člen přijímá dva parametry. První je sdílený ukazatel na třídu, se kterou pracujeme v této funkci.
ProfileObserver::OnLoadSuccess očekává, že obdrží mip::FileProfile.
ProfileObserver::OnAddEngineSuccess očekával by mip::FileEngine.
Druhý je sdílený ukazatel na kontext. V naší implementaci je kontext odkazem na std::promise, který je předán jako std::shared_ptr<void>. První řádek funkce převede toto na std::promise, poté je uložen do objektu nazvaného promise.
Nakonec se připraví budoucnost nastavením promise->set_value() a předáním objektu 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.
Když vytvoříme instanci jakékoli třídy sady SDK nebo použijeme funkci, která provádí asynchronní operace, předáme implementaci pozorovatele konstruktoru nastavení nebo samotné asynchronní funkci. When instantiating the mip::FileProfile::Settings object, the constructor takes in mip::FileProfile::Observer as one of the parameters. Tento příklad ukazuje náš vlastní ProfileObserver, použitý v konstruktoru mip::FileProfile::Settings .
Implementace pozorovatele obslužné rutiny souboru
Podobně jako pozorovatel profilu mip::FileHandler implementuje mip::FileHandler::Observers třídu pro řízení asynchronních oznámení událostí při operacích se soubory. The implementation is similar to that detailed above.
FileHandlerObserver is partially defined below.
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
This sample is just the first two functions, but the remaining functions use a similar pattern to these and to 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