Проблемы с удаленными общими объектами Fms Flex 4

#apache-flex #adobe #flash-media-server #shared-objects

#apache-flex #adobe #flash-медиа-сервер #общие объекты

Вопрос:

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

Я делаю это первым:

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

и, наконец, я добавляю пользователей в список.

Спасибо!

Ответ №1:

Я бы сказал, что вам нужно использовать sharedObject.setDirty("usersID");

SharedObject не может знать, что вы изменили содержимое ArrayCollection, потому что ссылка на него не изменилась. Вы можете использовать SetDirty() для принудительной синхронизации.

Примечание: Метод SharedObject.setProperty() реализует метод SetDirty(). В большинстве случаев, например, когда значением свойства является примитивный тип, такой как String или Number, вместо SetDirty следует использовать setProperty(). Однако, когда значением свойства является объект, содержащий его собственные свойства, используйте 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);
}
  

Ответ №2:

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

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