Не получать onSync события удаления для нескольких объектов SharedObject в том же SWF
У меня есть приложение, которое использует Remote SharedObjects, и я вижу странное поведение. Я пишу приложение ActionScript в AS3 с помощью Flash Builder и подключаюсь к Wowza Media Server 2.
Мое приложение работает отлично, но теперь я пытаюсь написать для него единичные тесты с использованием FlexUnit. Мои модульные тесты включают создание нескольких соединений с одним и тем же удаленным SharedObject и обеспечение корректности получения обновлений. Кажется, что все работает хорошо, за исключением того, что я не получаю никаких событий SyncEvent.SYNC с инфо-кодом "delete". Когда я запускаю свои приложения самостоятельно на отдельных вкладках или даже отдельных swf, встроенных в одну страницу, он отлично работает. По какой-то причине, хотя это не работает, когда внутри unit test. Я также обнаружил, что если я загружаю swfs с помощью Loader внутри того же SWF, то я получаю такое же поведение. Мне кажется, что-то странное в том, как мультиплееры одного и того же SharedObject ведут себя в одном и том же SWF. Мне приходилось работать с другим странным поведением в модульных тестах, например oldValues, которые не устанавливаются должным образом в событиях onSync.
У кого-нибудь есть идеи, как я могу обойти это? Это известная проблема? Я сумасшедший?:)
Поблагодарили бы за любую помощь!
Ответы
Ответ 1
Я также столкнулся с этой проблемой раньше, когда работал над некоторым Flex-приложением, используя некоторые системы кодирования, такие как Cairngorm, и подключался к AMFPHP с несколькими удаленными объектами.
В то время я решил решить эту проблему, чтобы убедиться, что эти удаленные объекты не будут запущены одновременно. Это пытается сделать некоторую так называемую "последовательную цепочку" для запуска этих удаленных объектов один за другим.
Для этого вам может быть трудно, если вы сделаете это с нуля, вы можете подумать о том, чтобы использовать эти современные рамки ActionScript 2.0, чтобы помочь вам (например, SWIZ или Robotlegs). Это может быть слишком сложным для обработки в самом начале. Я предлагаю вам просто разместить части удаленного объекта для обработки фреймворком, сохранив при этом другие вещи.
Ответ 2
Чтобы получить экземпляр sharedObject, вы используете статический метод SharedObject.getRemote()
. Я считаю, что этот метод всегда будет возвращать один и тот же экземпляр для заданного имени (и если параметр persistence имеет такое же значение).
У вас может быть такая же проблема при удалении объекта SharedObject из вашего приложения (mySO = null
), и вы повторно установите его, прежде чем сборщик мусора выполнит свою работу).
Такое поведение имеет смысл для меня, но иногда это может быть проблемой, которую я должен признать. В любом случае, это должно быть легко протестировать в сеансе отладки (посмотрите на номер экземпляра объектов).
Говоря об модульных тестах, что вы тестируете? Поведение SharedObjects? Если это так, я считаю, что здесь есть неправильное представление. Это вы действительно хотите проверить такое поведение (и меня будет интересовать причина), тогда я думаю, вам понадобятся более сложные тесты, которые запускают два отдельных приложения.
Надеюсь, что это поможет!
Ответ 3
У нас было подобное поведение с удалением в нашем проекте.
Когда мы вызываем so.close(). Затем удалите некоторый ключ в совместно используемом объекте. Затем снова подключите SO - он все еще видит удаленный ключ в живых.
Обходные пути: не закрывайте SO или не обновляйте удаленные ключи с некоторыми значениями констант (например, -2), чтобы пометить их удаленными.
Использовался Wowza 3.