远程共享对象的问题Fms Flex 4

时间:2011-04-16 01:00:17

标签: flex adobe flash-media-server shared-objects

我正在尝试开发一个同时用户可以进行交互的应用程序,我需要一个持久的远程共享对象,其中包含当前正在进行会话的用户列表。 当新用户进入会话时,他将获得具有列表的服务器对象。该列表是为了让所有其他用户都在会话中,但未定义。

我先做这个:

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);

最后我把用户放在列表中。

谢谢!

2 个答案:

答案 0 :(得分:0)

我想说,你需要使用sharedObject.setDirty("usersID");

SharedObject无法知道,您更改了ArrayCollection的内容,因为对它的引用没有改变。您可以使用setDirty()强制同步。

  

注意: SharedObject.setProperty()   方法实现了setDirty()   方法。在大多数情况下,例如何时   属性的值是原始的   你会喜欢String或Number   使用setProperty()而不是setDirty。   但是,当一个属性的值   是一个包含自己的对象   属性,使用setDirty()来表示   当对象中的值有   改变。一般来说,这是一个好主意   调用setProperty()而不是   setDirty(),因为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);
}

答案 1 :(得分:0)

我找到了一个对我有用的解决方案:

它包括在服务器上调用远程功能,然后广播给所有客户端。然后,客户应用必要的变化,使解决方案更稳定。