0

同時ユーザーが対話できるアプリケーションを開発しようとしていますが、現在セッション中のユーザーのリストと永続的なリモート共有オブジェクトが必要です。新しいユーザーがセッションに入ると、リストとともにサーバーのオブジェクトを取得します。そのリストには、他のすべてのユーザーがセッションに参加していると想定されていましたが、未定義です。

私はこれを最初にやっています:

users_so = SharedObject.getRemote("users_so", nc.uri, true);
users_so.connect( nc );
users_so.addEventListener( SyncEvent.SYNC, usersSyncHandler );

次に、プロパティを共有オブジェクトに設定します

remoteUsers = new ArrayCollection();
    remoteUsers.addItem(displayName);
    users_so.setProperty("usersID", remoteUsers);

そして最後に、ユーザーをリストに入れました。

ありがとう!

4

2 に答える 2

0

私は、あなたが使用する必要があると言うでしょうsharedObject.setDirty("usersID");

ArrayCollection への参照が変更されていないため、SharedObject は ArrayCollection の内容を変更したことを認識できません。setDirty() を使用して同期を強制できます。

注: SharedObject.setProperty() メソッドは setDirty() メソッドを実装します。プロパティの値が String や Number などのプリミティブ型の場合など、ほとんどの場合、setDirty の代わりに setProperty() を使用します。ただし、プロパティの値が独自のプロパティを含むオブジェクトである場合は、setDirty() を使用して、オブジェクト内の値がいつ変更されたかを示します。一般に、setDirty() ではなく setProperty() を呼び出すことをお勧めします。これは、setProperty() は値が変更された場合にのみプロパティ値を更新するのに対し、setDirty() はサブスクライブしているすべてのクライアントで同期を強制するためです。

これには単純な動的オブジェクトを使用しています。クライアントには読み取り専用の SharedObject があり、サーバーはこの SharedObject からクライアントを追加/削除するタイミングを決定します。

m_soSharedObject(リモート)、m_userListObject(ローカル)

if(m_so.data.userList != null) {                                                          
    for (var key:String in m_so.data.userList) {                                                     
        if(m_userList[key] == null) {                                                 
            _addUser(m_so.data.userList[key]);            
        }                                                 
    }                                                     
    for(var clientId:String in m_userList) {                                                     
        if(m_so.data.userList[clientId] == null) {                                                 
            _removeUser(clientId);                        
        }                                                 
    }
}                                                     

application.onAppStart = function () {

    userList = {};

    so = SharedObject.get("roster", false);
    so.setProperty("userList", userList);
}

application.onConnect = function (client /*Client*/, userId /*string*/) {
    application.acceptConnection(client);    
    client.userId = userId;
    userList[userId] = userId;
    so.setProperty("userList", userList);
}

application.onDisconnect = function (client /*Client*/) {
    var userId = client.userId;
    delete userList[userId];
    so.setProperty("userList", userList);
}
于 2011-05-12T23:37:25.603 に答える
0

私にとってより効果的な解決策が1つ見つかりました。

サーバーでリモート関数を呼び出してから、すべてのクライアントにブロードキャストします。その後、クライアントは必要な変更を適用して、ソリューションをより安定させます。

于 2011-05-18T13:40:57.940 に答える