« UJMLサンプル100ぐらい | メイン | トラックバックステーションができたものの、全部記事トラックバックすべきか悩む »

「Zipcode converter app」で学ぶ その1 _link()の使い方(2006/04/23)

 UIEからWEBアプリケーション開発において重要になる、データバインディングのためのサンプルコードが公開された。このサンプルはUIEngine上でWEBアプリケーションを開発するために重要なノウハウを教えてくれる。今回からこのコードを中心にして解説を進める予定。
※この解説は重要だと思う項目から解説する。そのため、ソースコードファイルの途中から解説してる可能性が高い。

 ソースコードはこちらの、「Zipcode converter app」にある、"Download here"から取得することができる。

 今回解説するのは、recordset.ujms というファイルに入っている openEx という関数だ。およそ100行目ぐらいにあるだろう。

 この関数について

概要:指定されたurlに_link()する。接続が上手くできなかったときの処理もちゃんとできるようにする。ちなみに_link()はサーバー上に配置されたリソースにアクセスするための関数。
引数:
handler サーバーとの通信を一意に識別するためのIDみたいなもの。サーバーとの通信は非同期に行うのでIDが必要。
url 接続先のURL
params リクエストするときのパラメーター
fDiscard キャッシュされているものを削除するかどうか true:削除する。

戻り値:
-1 開きが無いので_link()しなかったということ
数値 _link()処理を一意に識別するための番号

 まず下のコードブロック1は関数の宣言及び、関数内で使用する変数を宣言している。visibility="public" としているが、この解説は次回以降に回す。

---- コードブロック1
                    <function name="openEx" type="int" visibility="public"><!-- ★1:関数名と戻り値を宣言 -->
                        <parameters><!-- ★2:関数の引数 -->
                            <var name="handler" type="string"/>
                            <var name="url" type="string"/>
                            <var name="params" type="string"/>
                            <var name="fDiscard" type="boolean"/>
                        </parameters>
                        <variables><!-- ★3:関数内の script で使用する変数 -->
                            <var name="i" type="int"/>
                            <var name="result" type="int"/>
                            <var name="stFullURL" type="string"/>
                        </variables>
----

 まず、_link()できるかどうかを判定している。recordset.ujmsでは一度に_link()実行できる数を制限している(&MAX_OPEN_RECORDSETS;)。ここで、空きがあるか判定し、無ければresultが-1のままということだ。

---- コードブロック2
                        <script>
                            result = -1;

                            <!-- ★4:_link()を実行できるか判定する -->
                            <!-- mIsOpen[]の値が全てtrueだったら空いて無いということ -->
                            <!-- find an available handle -->
                            while (result == -1 &_AND; i &lt; &MAX_OPEN_RECORDSETS;)
                            {
                                if (mIsOpen[ i ])
                                {
                                    i = i + 1;
                                }
                                else
                                {
                                    result = i;
                                }
                            }
----

 以降は、上のコードブロック2で空きがあると判定された場合のみ実効される処理がメイン(★6から)。まず、_link()前に必要な値を初期化する。ここでは、今何番(result)でどこに(url)リンクするのか?の値を格納し初期化している。

 「★7」これがこの関数の肝だろう。これは、_link()が正しくできなかった場合のためのものだ。sRequestFailedHandlerをtrueにすることで、onRequestFailedイベントをキャッチできるようにしている。この方法は_link()処理をクライアント側で管理するための極めて重要なtipsと言える。

 「★8」でキャッシュを削除する指令があったら、キャッシュを削除している。

 「★9」では_link()を実行しているが、mURLToDiscard[result] = stFullURL;としているところも、★7で解説した通り重要なことである。_link()した内容はデバイス中にキャッシュされる。そのキャッシュをクリアするためには_link()実行時に指定したURL文字列と同じURLで、_discard("url")という具合に実行する必要がある。これはそのための準備である。

---- コードブロック3
                            <!-- ★5:_link()の実行 -->
                            if (result != -1)
                            {
                                <!-- ★6:初期化 -->
                                <!-- allocate/initialize handle -->
                                mIsOpen[ result ] = true;
                                mHandler[ result ] = handler;
                                mURL[ result ] = url;
                                mCurRec[ result ] = 0;
                                mNumRecs[ result ] = 0;

                                <!-- ★7:onRequestFailedイベントをキャッチできるようにステート変数sRequestFailedHandlerをtrueにセット -->
                                <!-- listen for network load failures -->
                                _clear_state(sRequestFailedHandler[result]);
                                sRequestFailedHandler[result] = true;

                                <!-- ★8:キャッシュを消す指定があったらキャッシュを削除 -->
                                <!-- fetch the data; client will get a notification event when the data is ready -->
                                if (fDiscard)
                                {
                                    _discard(mURLToDiscard[result]);
                                }

                                <!-- ★9:リンクを実行 -->
                                stFullURL =  _strcat(  url, "?handle=", result, "&amp;maxRS=", &MAX_OPEN_RECORDSETS;, "&amp;maxF=", &MAX_FIELDS_PER_RECORD;, params );
                                mURLToDiscard[result] = stFullURL;
                                 _link( _strcat( "data", result ), stFullURL , 10000);
                            }
                        </script>
                        <return>
                            <eval>result</eval>
                        </return>
                    </function>
----

とりあえず初回はここまで。以降続くかどうかわからないが、重要なポイントを見つけたら解説したい。

トラックバック

この記事のトラックバックURL:
https://www.typepad.com/services/trackback/6a00d8341c2e2e53ef00e550a9e3908834

「Zipcode converter app」で学ぶ その1 _link()の使い方を参照しているブログ:

コメント

この記事へのコメントは終了しました。