0
Thumbsup

いい質問だ

0

Thumbsdown

うーん

Ti.App.FireEvent の不思議

body.and.soul
body.and.soul 10

投稿日:2012-10-18 23:09:02

いつも貴重なアドバイスを頂き、ありがとうございます。
またしても不思議な現象に悩まされています。
最近、Facebookを相手に遊んでいるのですが、そこで通信をしている部分から一定の条件を満たせば、Ti.App.FireEventで発火させ、通信結果を処理するコードを書いています。通信の非同期処理をイベント起動で同期させているわけです。
ところが、最初の一回目(つまり一回目の通信)は正常にイベント起動して通信結果の処理ができるのですが、二回目以降、なぜか発火させているコードを経由していないにもかかわらず、Ti.App.addEventListenerで定義したイベントハンドラ部分に飛び込んでくるのです。
このようなことがあり得るのでしょうか?
ちなみに、二回目以降の場合、イベントハンドラ内部ではe.successにはなっていません。
ログを出力させて、何度も確認しているのですが、不可解な気持ちになるばかりです。
どうかアドバイスを頂ければ幸いです。
よろしくお願いいたします。



回答

body.and.soul
body.and.soul
10

Thumbsup

いい回答

0

Thumbsdown

うーん

一部、情報を訂正させてください。
二回目以降、イベントハンドラ内部ではe.successになっていないと書きましたが、e.successになっています。つまり、(おそらく)通信自体は成功していると思われます。
実は、一瞬、これはFacebookの通信制限などに引っかかったのかと考えていたのですが、それは誤りのようです。
それから追加情報があります。
Ti.App.FireEventをしないのにイベントハンドラに飛び込むと書きましたが、どうも、この現象は、問題の二回目以降は一回飛び込み、三回目以降は二回飛び込み、四回目以降は三回飛び込む、といった動きをしているようです。
この追加情報が参考になるのかどうか、わかりませんが、気がついた点を書かせて頂きます。
どうか、よろしくお願いいたします。
ちょっと途方に暮れています。


body.and.soul
body.and.soul
10

Thumbsup

いい回答

0

Thumbsdown

うーん

実際のコードは次のようなものになります。

FunctionA = function() {
    Ti.App.addEventListener("app:getInfoFire", function (e) {
        Ti.API.info("get fire!");
        if (e.success) {
            // データ処理
        }
    });
    for (条件) {
        Ti.Facebook.requestWithGraphPath(url, {}, function(e) {
            if (e.success) {
                // データ処理
                if (条件) {
                    Ti.API.info("fire !");
                    Ti.App.fireEvent("app:getInfoFire", e);
                }
            }
        });
    }
};

ここでTi.API.info("fire !")が実行されないのにTi.App.addEventListener("app:getInfoFire", function (e)に飛び込んでくる(ように見える)という現象に悩まされているのです。
umi_uyura
umi_uyura
140
Tcad_icon

Thumbsup

いい回答

0

Thumbsdown

うーん

初めまして。
私も最近似たような経験がありましたので、
参考になればと思い、投稿させて頂きます。
Ti.Appはグローバルなオブジェクトなので、
もし上記コードのFunctionAを複数回呼び出しているとすれば、
addEventListenerが呼び出される度にイベントハンドラが登録されている可能性があると思います。
その場合、1回のfireEventに対して、
addEventListenerが呼び出された回数分のイベントが発生することになるようです。
私の場合の解決策としては、
該当するイベントハンドラが不要になるタイミングでTi.App.removeEventListenerで削除し、
登録されているハンドラが常に1つだけになるようにしました。
上記コードを見た感じでは、FunctionAを繰り返し使用されているのであれば、
addEventListenerを実行するタイミングをFunctionAの外側に移すという考え方でも良いかもしれません。
よろしくお願い致します。


body.and.soul
body.and.soul
10

Thumbsup

いい回答

0

Thumbsdown

うーん

ありがとうございます。
なるほど、と光が見えたような気がしました(苦笑)。
後で確かめて、結果をご報告します。
非常に参考になりました。


body.and.soul
body.and.soul
10

Thumbsup

いい回答

0

Thumbsdown

うーん

確認しました。
外に出すことで、問題の現象は発生しなくなりました。
そういうことかと。
ありがとうございました。
私も、早く何か回答できる側に回れればよいのですが(苦笑)。


umi_uyura
umi_uyura
140
Tcad_icon

Thumbsup

いい回答

0

Thumbsdown

うーん

現象が発生しなくなったとのことで良かったです。
自分も初めての回答だったので、お役に立てて嬉しいです。


ログインすると回答することができます。