Ваши классы Main и ContentDatabase слишком связаны!
Ваши данные содержатся в файле XML, практически вам нужно сначала загрузить файл, проанализировать, упорядочить и сохранить данные, а затем вы можете манипулировать этими данными.
Я не согласен с Sr.Ричи, Синглтон действительно здесь не нужен.
ContentDatabase должна просто заботиться о загрузке XML, в идеале исходный URL не должен быть жестко задан в классе.
Например, вы можете передать URL-адрес в качестве параметра методу initDb
database.initDB("resources/slides.xml");
После загрузки данных эффективная практика заключается в отправке события для информирования основного класса о том, что данные готовы.Вы можете использовать CustomEvent или Signal и передавать данные как объект.Таким образом, у вас не будет ненужных зависимостей между классами Main и ContentDatabase.
private function onComplete(e:Event):void
{
try
{
main.databaseXML = new XML(e.target.data);
xmlLoader.removeEventListener(Event.COMPLETE, onComplete);
xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
//better process the XML data here...
processXML();
}
catch (err:Error)
{
trace('broke: ' + err.message);
}
}
private function processXML():void
{
// process the data...
// inform the Main class by dispatching an Event
// and pass the data as a parameter
// use a CustomEvent or a Signal
}
Тогда в вашем классе Main
//If you use a CustomEvent
private function xmlLoadComplete( event:XMLCustomEvent ):void
{
var introSlideXML:XML = event.introSlideXML;
var theSlide:MovieClip = introSlide.createSlide(introSlideXML);
}
Существует несколько способов отправки и прослушиванияСобытия между основным классом и базой данных ContentDatabase.Как уже упоминалось выше, вы можете использовать сигналы.Вы также можете создать легкую зависимость, передав диспетчер событий в ContentDatabase.Это делается для того, чтобы тот же диспетчер прослушивал и отправлял событие.
public var database:ContentDatabase = new ContentDatabase(dispatcher);
Затем в contstructor ContentDatabase ...
this.dispatcher = dispatcher;
, затем в processXML ()
private function processXML():void
{
// after all the processing
dispatcher.dispatchEvent( new XMLCustomEvent (introSlideXML ) );
}
И, конечно же, в вашем основном классе
//In case of CustomEvent
public function main()
{
//the same dispatcher listens
dispatcher.addEventListener( XMLCustomEvent.XML_LOADED ,
xmlLoadComplete );
database.initDB();
}
Хотя возможно использовать XML в качестве нативного объекта AS3, я часто предпочитаю создавать свой собственный объект или класс, заполняя егоXML-данные, чтобы я мог вызывать их свойства напрямую, вместо того, чтобы запрашивать XML, но это личный вкус ...