2012-01-24 6 views
2

ユーザーがDataGridでアイテムを選択すると表示されるNavigatorContentがあります。 このNavigatorContentには、関連するオブジェクトを表示するフォームとアコーディオンが含まれています。ユーザーがNavigatorContentにフォームを保存]ボタンを押すと、子供たちはBlazeDSのを介してサーバーを呼び出すことにより、データベースに保存されなければならないフレックス:サーバーに保存するオブジェクトを渡すアプリケーションがフリーズする

saveObjectToDB() 
{ 
    //Map the form values to the object 
    object.field1 = object_field1.text; 
    object.field2 = object_field2.selectedDate as Date; 
    object.relatedobject3 = comboBox.selectedItem as RelatedObject3; 
    //etc..... 

    //Loop through accordion to save the child objects 
    for(var i:int= 0; i < accordion.numChildren; i++) 
    { 
    if(accordion.getChild(i) is RelatedObject1Form) 
    { 
     var formRelated1:RelatedObject1Form = accordion.getChild(i) as RelatedObject1Form; 
     //Map the form values to the related object 
     object.relatedobject1.field1 = formRelated1.relatedobject1_field1.selectedDate; 
     //etc... 
    } 
    if(accordion.getChild(i) is RelatedObject2Grid) 
    { 
     var gridRelated2:RelatedObject2Grid = accordion.getChild(i) as RelatedObject2Grid; 
     //Get dataProvider for the datagrid of the relatedObject 
     object.relatedobject2 = gridRelated2.object.relatedobject2; 
    } 
    } 

    // Call the remoting object's saveObject method 
    var saveObjectOperation:Operation = new Operation(); 
    saveObjectOperation.name = "saveObject"; 
    saveObjectOperation.arguments=[object]; 
    ro.operations = [saveObjectOperation]; 
    saveObjectOperation.send(); 

    if(isNewObject) 
    //dispatchEvent new object 
    else 
    //dispatchEvent object updated 
} 

私の問題は、質問の状態私のアプリケーションがフリーズするようですユーザーがこのメソッドを呼び出す保存ボタンを押したときに数秒間押し続けます。私はそれはFlexがシングルスレッドであるためだと思いますが、まだこのメソッドが計算上の高価なのはなぜですか?私はアコーデオンの子供たちにループするループをコメントアウトしても問題はないようです。

リモート保存メソッドを呼び出す前に、オブジェクト関連のオブジェクトをnullに設定しようとしましたが、これが保存メソッドを高速化するように思えましたが、後でいくつかの問題が発生しました。

私の結論は、リモート呼び出しがアプリケーションをフリーズしているということです。関連するオブジェクトをnullに設定すると、これが問題を解決するようです。しかし、これは本当に必要ですか?関連するオブジェクトはそれほど大きくはないので、私はリモート呼び出しがアプリケーションを数秒間フリーズさせる理由を理解していません。

これはNavaigatorContentの初期化時に、私はアコーディオンの子を作成する方法である:私はアコーディオンの子どもたちに渡す

var relatedObjectForm:RelatedObject1Form= new RelatedObject1Form(); 
    accordion.addChild(relatedObjectForm); 
    relatedObjectForm.object= object; 
    relatedObjectForm.ro = this.ro; 

オブジェクトは公開されて、[バインド可能] NavigatorContentにし、アコーディオンの子どもたちに最初はメインのDataGridから渡されます。これはこの問題に関連する問題かもしれませんか?

ご意見やご感想をいただければ幸いです。この問題は、私の美しさの睡眠に影響を与え始めています;)

+0

誰もこの種の問題を経験したことがありますか? =) – Sebastian

答えて

2

私はシリアライザで多くの時間を費やしていると思います。アプリにトレースターゲットを入れて、何が送信されているかを確認するためにコンソールが実行されているのを見る。

ほとんどの問題は、DisplayObjectsの問題です。アプリケーションに追加された場合、アプリケーション自体への参照があり、一部のシリアライザでアプリ全体のシリアル化が開始されます。バインド可能なオブジェクトには、奇妙なイベントが添付され、最終的にDisplayObjectにアタッチされる可能性があります。既存のオブジェクトへの参照だけではなく、オブジェクト内の関連する値をコピーしてみてください。

+0

ありがとうDan Monego!私は午前中にそれをチェックして戻ってきます=) – Sebastian

+0

私は正しい方向に向いてくれてありがとう。私はまだ問題が何であるか完全にはわかりませんが、私はObjectUtil.copy()を使用して関連するオブジェクトをnullに設定し、一般的に必要な情報をサーバーに送り返すだけで解決します。私はDisplayObjectについて正しいと思います。私はそれをすべて混乱させたオブジェクトを見つけたと思う! :)私はまだそれはちょっと奇妙な問題だと思う。 – Sebastian

関連する問題