apache-flex - Flex:サーバーに保存するオブジェクトを渡すとアプリケーションがフリーズする

apache-flex blazeds

ユーザーが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がシングルスレッドであるためだと思いますが、それでも、この方法が非常に計算コストがかかる理由がよくわかりませんか?アコーディオンの子をループするループをコメントアウトしても問題ないようです。

リモートのsaveメソッドを呼び出す前に、オブジェクトに関連するオブジェクトをnullに設定しようとしましたが、これにより、saveメソッドの速度が向上したように見えましたが、後で問題が発生しました。

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

これは、NavaigatorContentが初期化されたときにアコーディオンの子を作成する方法です。

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


アコーディオンの子に渡すオブジェクトはパブリックで、[Bindable]でNavigatorContentとアコーディオンの子にあり、最初はメインのDataGridから渡されます。これはこの問題に関連する問題でしょうか?

どんなヘルプ/コメントも大歓迎です。この問題は私の美しさの睡眠に影響し始めています;)
答え
私の推測では、シリアライザで多くの時間を費やしていると思います。アプリにトレースターゲットを配置し、実行時にコンソールを監視して、何が送信されているかを確認します。

最も可能性の高い問題はDisplayObjectにあります。それらがアプリケーションに追加されている場合、アプリケーション自体への参照があり、一部のシリアライザーがアプリ全体のシリアル化を開始します。バインド可能なオブジェクトには、最終的にDisplayObjectsに接続するいくつかの奇妙なイベントが添付されている可能性があります。既存のオブジェクトへの参照を取得するのではなく、関連する値をオブジェクトにコピーしてみてください。
関連記事

html - HTML / CSSスペーサー(フレックスのような)

apache-flex - 独自のクリックでのAIRランタイムとAIRアプリケーションのインストール

java - Flex 4.6 IOSコンパイラ

css - Flex 4.6 CSS vgroupの「ギャップ」は無視されました

java - WAR記述子と構造を理解する必要がある-WAR内のFlexプロジェクト

java - JavaとFlexの統合

flash - AIRアプリケーションのインスタンスがインストーラーによって呼び出されたかどうかを確認するにはどうすればよいですか?

android - Flex 4.5を使用して複数の解像度をターゲットにする

actionscript-3 - Adobe FlexのMXMLコンポーネントのセッターのオーバーライド

apache-flex - Red5メディアサーバーとoflaDemoアプリを使用して録画ビデオの品質を向上させる