我正在尝试开发一个同时用户可以进行交互的应用程序,我需要一个持久的远程共享对象,其中包含当前正在进行会话的用户列表。 当新用户进入会话时,他将获得具有列表的服务器对象。该列表是为了让所有其他用户都在会话中,但未定义。
我先做这个:
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);
最后我把用户放在列表中。
谢谢!
答案 0 :(得分:0)
我想说,你需要使用sharedObject.setDirty("usersID");
SharedObject无法知道,您更改了ArrayCollection的内容,因为对它的引用没有改变。您可以使用setDirty()强制同步。
注意: SharedObject.setProperty() 方法实现了setDirty() 方法。在大多数情况下,例如何时 属性的值是原始的 你会喜欢String或Number 使用setProperty()而不是setDirty。 但是,当一个属性的值 是一个包含自己的对象 属性,使用setDirty()来表示 当对象中的值有 改变。一般来说,这是一个好主意 调用setProperty()而不是 setDirty(),因为setProperty() 仅在更新时更新属性值 那个价值已经改变了 setDirty()强制同步 所有订阅的客户。
我正在使用简单的动态对象。客户端具有只读SharedObject,服务器决定何时从此SharedObject添加/删除客户端。
m_so
为SharedObject
(远程),m_userList
为Object
(本地)
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)
我找到了一个对我有用的解决方案:
它包括在服务器上调用远程功能,然后广播给所有客户端。然后,客户应用必要的变化,使解决方案更稳定。