PDA

Просмотр полной версии : Обновление методов "на лету"


Sweet07
08.02.2019, 00:53
Есть задача, чтоб определённые функции после запуска основного ПО можно было менять (код)
Подгрузка дополнительного кода происходит из внешних swf файлов.
Первичная загрузки при старте приложения проходит на ура: работают методы загруженной флешки, создание экземпляров объектов из библиотеки загруженной, обращение к переменным родительской и так далее.
Но вот засада: повторная загрузка изменённого файла загружаемой флешки не прёт. Методы и значения переменных в "загруженной " не меняются.

Основная

var fnc:*
//...тут код загрузки файла. LoaderContext.allowCodeImport присвоено true
function loadedFnc(e:Event):void{
if (fnc) fnc=null;
fnc=e.target.content;
trace(fnc.getVars(this))
}

function getParInfo():String{
return "Parent swf. Running and cozy.";
}


В загружаемой флешке код примерно такой. Меняется id

var par:*
var id:int=345;
function getVars(parnt:*):void{
par=parnt;
trace(par.getParInfo());
trace("Loaded swf id =",id);
}


При загрузке обновлённой остаётся висеть старая...но при перезапуске основной - естественно подгружается обновлённая.

Кто уже пробовал копать в данной тематике?

Добавлено через 2 минуты
Загрузка происходит через File. Среда выполнения AIR

ZackMercury
08.02.2019, 22:42
При загрузке нужно передавать в get запрос случайный аргумент, чтобы он не кешировался.
Например, это можно сделать добавлением к адресу флешки +"?rand="+Math.random()
Здесь rand - любое имя.

Sweet07
16.02.2019, 20:25
Не совсем понял про случайный аргумент.
ZackMercury, ты предлагаешь не заменять а загружать новые флешки с уникальным окончанием?
Поясни. Спасибо

Попробовал loader.UnloadAndStop(true) должен чистить кэш от прошлых данных.
Перед вызовом метода UnloadAndStop я сбрасываю значения переменных в загруженной флешке в null, чтоб дальше GarbageCollector доделал свою часть, но странно, ни то не то не помогло.

ZackMercury
16.02.2019, 22:19
Я ничего не писал про новые флешки, только про запрос со случайным параметром.
Что пояснять, если я привёл пример

caseyryan
17.02.2019, 19:58
Не совсем понял про случайный аргумент.
ZackMercury, ты предлагаешь не заменять а загружать новые флешки с уникальным окончанием?
Поясни. Спасибо

Попробовал loader.UnloadAndStop(true) должен чистить кэш от прошлых данных.
Перед вызовом метода UnloadAndStop я сбрасываю значения переменных в загруженной флешке в null, чтоб дальше GarbageCollector доделал свою часть, но странно, ни то не то не помогло.
А как ты вообще грузишь что-то? Из сети?
Зак тебе правильный пример привел. В URL, то, что идет после знака ? - это параметры. Просто передавай любой уникальный параметр, и браузер не будет кешировать запрос. Вернее, кешировать будет, но так как запрос каждый раз будет разный, то и ответ будет возвращаться не из кеша, а грузиться заново.
У тебя должно получиться что-то типа

example.com/flash.swf?rand=8798794587 // это число каждый раз меняй

Sweet07
17.02.2019, 20:46
Да не. Теперь я понял к чему был такой ответ, спасибо, caseyryan, за пояснение. Неее, всё происходит локально. За обновление этих файлов у меня отвечает другое ПО (Яндекс диск - так удобнее), он уже самостоятельно ломится на свой сервер и оттуда закачивает обновлённые данные. Загружаемая флешка с функциями и библиотеками всегда в одном и том же месте. Загрузка происходит прямой ссылкой на локальный объект в выполняемую программу в среде AIR.

Добавлено через 1 минуту
Но совет обязательно применю когда дойду до разработки мобильного ПО

caseyryan
18.02.2019, 10:05
В мобильном ПО это как раз не нужно. Этот фикс нужен для работы в браузере