2009-03-12 11 views
3

私の質問は非常に簡単です:flex3では、xmlファイルを同期してロードする方法はありますか?Flex 3:xmlファイルの同期読み込み

ロードイベントを使用して非同期にロードする方法を知っています。これは役に立つかもしれないし、そうでないかもしれない。私はちょうどファイルを読んで、それを解析し、私がそれをしなければならないことをし、コードを実行し続けたいと思う。

xmlファイルを使用していくつかの構成パラメータを格納するコンポーネントがあります。オブジェクトが初期化されたときにファイルを読み込む必要があります。しかし、イベントモデルでは、ファイルがロードされたときを制御することができないため、ロードするコードを「待機」する必要があります。これはちょうどばかげたことですか、それとも私ですか?

var foo:Foo = new Foo(); //This constructor should read the xml and initialize the object. 
foo.doSomething(); //When I call this method the xml must be already handled. 

私はイベントでxmlファイルを扱うことができ、そしてそれが正常に動作しますが、イベントが発生 doSomethingの方法:私はこのようなコードが欲しいです。

私は自分自身を説明してくれることを願っています。私はこれが本当に簡単だと思うが、それは私を夢中にさせている。本当に必要な場合を除き、イベントを待つコードを書いてはいけません。私はこのすべてがちょうど1行のコードでなければならないと感じています!

答えて

1

同期することはできません。フラッシュはウェブ用に構築されており、通話の所要時間は決して確認できません。空気はファイルシステムからの負荷であり、そこには同じくらいの遅延がどこにもないからです。

きれいな解決策は、Fooの内部からdoSomethingの()を呼び出すの内側に完了するために、負荷をリッスンするだろう、この方法あなたの「外側」のクラスはまったく気にする必要はありません。

外部からfoo.doSomething()を呼び出す必要がある場合は、イベントシステムを使用できます。あなたのFooクラスの発送は、それがロードが行われているイベントましょう:

dispatchEvent(new Event(Event.COMPLETE, true)); 

あなたがそうのようにそれをリッスンする必要があることをキャッチするには:

foo.addEventListener(Event.COMPLETE, handleFooComplete); 

そして、あなたイベントハンドラ関数は次のようになります。

private function handleFooComplete(e:Event):void{ 
    foo.doSomething(); 
} 

ただし、実行することを選択した場合は、ローダーでEvent.COMPLETEを待機する必要があります。それを回避することはありません。

1

私は、負荷のある「後」イベントがあると思います。

ので、あなたは()

ロードした後CALLDさ)initalisationに呼ばれている)(新)と二つの異なる方法で行う()の呼び出しなので、(新しいへの呼び出しを分割して(しなければなりません

pseudosyntax:XMLのロードイベントのイベントハンドラ内から

beforeInitialisation() 
    disableDoSomething() 
    new()... 
    loader.addEvent(AFTERLOAD, afterLoad) 


afterLoad() 
    enableDoSomething() 


someMethod() 
    doSomething() 
+0

申し訳ありませんがわかりません。 Fooクラスの中で、私は異なるイベントでコードを分割できます。問題は、イベントが発生したときに制御できないことです。これらすべてのイベントの後にfoo.doSomething()を呼び出す必要があります。そのようにする方法はわかりません。 – rgargente

+0

"var foo:Foo = new Foo();" - 部分と "foo.doSomething();"部分は2つの異なる関数/メソッドになければなりません(SQLではBEFOREとAFTER-trigger ) –

+0

ピーターさん、ありがとうございます、今はっきりしています。しかし、これは私のニーズにも合っていません。私はsomemethodを呼ぶ余裕がなく、ただ何もしません。私自身の答えを参照してください – rgargente

0

コールfoo.doSomething();(例えばEVENT.Completeまたはsomesuchは、ファイルをロードする方法を正確に依存します)。これが推奨される方法です。

+0

はいを​​使用してください。しかし、それは混乱します。 doSomethingは概念的に初期化の一部ではありません。オブジェクトのライフサイクル中に何度も呼び出されます。今では、必要があれば、initの直後に呼び出すことができます。しかし、これとは別に正当な理由はありません。 – rgargente

+0

「多くの時間」には前駆物質が必要です。それを識別し、createとeventを行い、doSomething()をハンドラとして設定してください。 – dirkgently

+0

はい、そうです。ユーザーがボタンをクリックすると、イベントが発生します。今すぐユーザーが最初にクリックすると、オブジェクトが遅延して作成されました。私はアプリケーションをロードするときにそれをinitiliazeします。私の新しい答えを見てください。ご協力いただきありがとうございます! – rgargente

1

私は自分自身に答えますが、誰かがより良いアイデアを思いついているかどうかはまだ分かりません。 dirkgentlyとピーターMiehleからの回答はどちらも役に立ちますが、私の実際の問題は解決しません。

同期読み込みはできないようです。ローディングが失敗するか、時間がかかり過ぎる可能性があります。そのためにアプリケーションをフリーズすることはできません。それは合理的ですが、私はまだコードをもっと複雑にする必要があると感じています。

私がしようとしているのは、オブジェクトを作成する前にxmlファイルを読み込んで、それをコンストラクタのパラメータとして渡すことです。そうすれば、必要なときにオブジェクトにXMLファイルがロードされていることを確認できます。これは理想的な解決策ではありません。なぜなら、Fooの「私的なもの」の責任を別のクラスに負わせなければならないからです。

もっと良いアイデアを教えてください。

+0

'アプリをフリーズする' - ブロックされたI/Oが許可されていない正確な理由です。 – dirkgently

+0

しかし、AIRは、同期モードで動作するオプションを持つFileStreamオブジェクトを持っています。 – dirkgently

+0

ネットワークからファイルをロードしていますか?そうでなければ、待ち時間はそれほど長くないはずです。そうでなければ、それが巨大なファイルならば、Socket/XMLSocketを使い、チャンクを読み込みます。 – dirkgently

1

私はまだ多くの人がここに来ると確信しています。ここに私の解決策があります。

あなたはresultEvent

は、あなたが何かをしたいオブジェクトを持って処理する関数の内部で派遣カスタムイベントを作成し、私はこのケースでは、それがどのそしてだろう、このカスタムイベントをリッスンするために、FOOだったと思いますdoSomething()を呼び出します。

関連する問題