Notify data changes using Observer pattern

This pattern, in contrast with callbacks, allows us to clearly see
the dependency and hierarchy between the objects. It will also help
on writing unit tests as we can count how many times a notification
was triggered.
This commit is contained in:
Thiago Marcos P. Santos
2015-04-21 14:33:14 +02:00
parent 4956da61b9
commit f4baa0ba3e
5 changed files with 64 additions and 24 deletions

View File

@@ -5,7 +5,6 @@
#include <mbgl/style/style.hpp>
#include <cassert>
#include <functional>
namespace mbgl {
@@ -15,6 +14,10 @@ ResourceLoader::ResourceLoader() {
ResourceLoader::~ResourceLoader() {
assert(Environment::currentlyOn(ThreadType::Map));
for (const auto& source : style_->sources) {
source->setObserver(nullptr);
}
}
void ResourceLoader::setObserver(Observer* observer) {
@@ -29,7 +32,8 @@ void ResourceLoader::setStyle(Style* style) {
Environment& env = Environment::Get();
for (const auto& source : style->sources) {
source->load(accessToken_, env, std::bind(&ResourceLoader::emitTileDataChanged, this));
source->setObserver(this);
source->load(accessToken_, env);
}
}
@@ -37,6 +41,14 @@ void ResourceLoader::setAccessToken(const std::string& accessToken) {
accessToken_ = accessToken;
}
void ResourceLoader::onSourceLoaded() {
emitTileDataChanged();
}
void ResourceLoader::onTileLoaded() {
emitTileDataChanged();
}
void ResourceLoader::emitTileDataChanged() {
assert(Environment::currentlyOn(ThreadType::Map));