Проблемы с удаленными общими объектами Fms Flex 4 - PullRequest
0 голосов
/ 16 апреля 2011

Я пытаюсь разработать приложение, в котором одновременно могут взаимодействовать пользователи, и мне нужен постоянный удаленный общий объект со списком пользователей, которые в данный момент находятся в сеансе.Когда новый пользователь входит в сессию, он получает объект сервера со списком.Этот список должен был включать всех других пользователей в сеанс, но он не определен.

Сначала я делаю это:

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 голосов
/ 18 мая 2011

Я нашел одно решение, которое лучше работает для меня:

Он заключается в вызове удаленных функций на сервере и последующей трансляции всем клиентам. Затем клиенты применяют необходимые изменения, делая решение намного более стабильным.

0 голосов
/ 13 мая 2011

Я бы сказал, что вам нужно использовать 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);
}
...