2011-04-16 71 views
0

我正在嘗試開發一個應用程序,其中用戶可以同時進行交互,並且需要持久遠程共享對象與當前正在進行會話的用戶列表。 當新用戶在會話中輸入時,他將獲得服務器的對象和列表。該列表旨在讓所有其他用戶在會話中但未定義。遠程共享對象的問題Fms Flex 4

我這樣做第一:

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

和finaly我把列表中的用戶。

謝謝!

回答

0

我找到了一個解決方案,爲我的作品更好:

它由調用服務器遠程funcions再播到所有客戶。然後客戶應用這些必要的改變使解決方案更加穩定。

0

我會說,你需要使用sharedObject.setDirty("usersID");

共享對象無法知道,你改變了ArrayCollection的內容,因爲對它的引用並沒有改變。您可以使用setDirty()強制同步。

注:的SharedObject.setProperty() 方法實現了setDirty() 方法。在大多數情況下,例如 屬性的值是原始類型 類型如字符串或數字,您將 使用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); 
}