Фильтр типов файлов для диалога browseForSave()

Столкнулся с такой проблемкой. В диалоге browseForSave() нужно было дать возможность сохранять файлы с расширением .xml. В диалоге browseForOpen() возможность установки фильтра типов файлов есть:

var file:File = new File();

var txtFilter:FileFilter = new FileFilter(“dictionary (*.xml)”, “*.xml”);

file.browseForOpen(“Open”, [txtFilter]);

 а в диалоге browseForSave() “адобовцы” про фильтр забыли.

Решил проблему так:

 public function saveFileDialog():void {

            var docsDir:File = File.documentsDirectory;

            try {

                docsDir.browseForSave(“Save As”);

                docsDir.addEventListener(Event.SELECT, fileSelectedForWrite);

            }

            catch (error:Error) {

                trace(“Failed:”, error.message)

            }

  }


 private function fileSelectedForWrite(event:Event):void {

            file = event.target as File;

            var len:Number = (file.extension != null) ? file.extension.length : 0; 

            if (len) {

                file.nativePath = file.nativePath.substr(0,file.nativePath.length-len) + “xml”; 

            }

            else file.nativePath += “.xml”; 

            this.dispatchEvent(new Event(SAVE_FILE_COMPLETE));

 }

Сохранения данных на локальный компьютер

Это первая из серии статей посвящённая вопросам сохранения данных во флеш на локальный компьютер пользователя.
Как вам известно, флеш не имеет возможности непосредственного сохранения данных в файл на компьютере, поэтому применяются серверные скрипты, которые записывают данный на сервер (в файл или базу данных).
Но иногда нужно сохранить данные на локальный компьютер, чтобы не было необходимости обращаться к веб серверу, да и чтобы совсем не быть зависимым от интернета – как быть в этих случаях.
Начиная с Flash 6/MX, во флеше появились возможности, которые позволяют добиться желаемого результата – сохранения данных на компьютер.

Скажем вы имеете профиль пользователя, который хотите хранить на его локальной машине.
Возможно ваш web-сайт имеет некоторое количество страниц, с Flash или Flex приложениями, и вы хотели бы, чтобы эти приложения использовали одну и ту же информацию о профиле пользователя.
Лучший способ для обеспечения такой функциональности – SharedObject.
SharedObject – это технология, которая позволяет сохранять данные на локальный компьютер, по аналогии с кукисами в браузерах (этакие флеш-кукисы).
Конечный пользователь может управлять размером всех SharedObjects – не только ваших приложений, а также вобще запретить его использование. Учтите эти ограничетия при разработке ваших приложений.
Хотя по умолчанию функция записи в SharedObjects включена.
Поэтому стоит на сайте или в игре порекомендовать пользователям в обязательном порядке “включить флеш-кукисы”, чтобы иметь возможность сохраняться.

Использовать SharedObject довольно просто. Ниже пример сохранения строки (String) и числа (Number).


var so:SharedObject = SharedObject.getLocal( "MyAppData" );
so.data.customerName = customerData.name;
so.data.serialNumber = customerData.serialNumber;
so.flush();

И это всё :) . Локальный SharedObject создастся с именем “MyAppData”.
Обратите внимание что я установил свойства! Это важно – вы не можете менять значение data, можете устанавливать свойства.

Считывать информацию тоже просто:


var so:SharedObject = SharedObject.getLocal( "MyAppData" );
if( so.data.customerName ) customerData.name = so.data.customerName;
if( so.data.serialNumber ) customerData.serialNumber = so.data.serialNumber;

Обратите внимание что я проверяю каждое свойство на существование перед его использованием.

Рассмотрим теперь другой пример. Допустим у вас есть класс Person, который имеет члены, такие как имя и возраст. Как же сохранить экземляр данного класса?


var currentPerson:Person;
...
so.data.person = currentPerson;

Это вообще работает, но то что сохранено в SharedObject, не инстанс класса Person. Скорее so.data.person – простой Объект ActionScript – вся информация относительно класса была удалена.

Когда вы будете считывать информацию, нужно будет устанавливать соответствия:


currentPerson.name = so.data.person.name;
currentPerson.age = so.data.person.age;
currentPerson.address.street = so.data.person.address.street;
...

Также не гарантируется что сохранится вложенность объектов.
Лучший способ – использовать сериализацию. Например с помощью flash.utils.IExternalizable, или использовать XML.
Реализация IExternalizable требует, чтобы ваши классы имели две функции: writeExternal и readExternal. Собственно Вы преобразовываете ваш класс в ряд байтов, которые могут быть сохранены в SharedObject и быть считанными назад позже. Например:


class Person implements IExternalizable
{
public function writeExternal( output:IDataOutput ) : void
{
output.writeUTF(name);
output.writeInt(age);
address.writeExternal(output);
}

public function readExternal( input:IDataInput ) : void
{
name = input.readUTF();
age = input.readInt();
address.readExternal(input);
}
}

Сохранение:


var bytes:ByteArray = new ByteArray();
currentPerson.writeExternal(bytes);
so.data.person = bytes;
so.flush();

Если Вы предпочитаете использовать XML, чем ByteArray, просто напишите функции, для создания XML (toXML) и его разбора XML (fromXML) вместо writeExternal и функций readExternal, соответственно.

Для простого класса это не нужно. Но если вы имеете сложный класс, конечно лучше использовать преобразованные в последовательную форму данные (сериализацию) в SharedObject.

О совместимости.

Замечу, что разные версии флеш плееров пишут в разные папки (пути) на компьютере свои флеш-кукисы.

В частности flash 7 плеер в папке Flash Player создаёт папку localhost и в ней уже путь к кукису. А вот flash 8 плеер делает в папке Flash Player вначале папку #SharedObjects, потом _Number_ (набор из 8 случайных символов), а лишь потом localhost и путь к кукису.

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

Ну и при переносе флешки на другой компьютер, её флеш-кукисы сами не перенесутся. Так что если вы хотите перенести ваши сейвы, нужно это сделать самостоятельно. Записать файл с флеш-кукисом (save.sol) на другой компьютер.

Что представляет собой фреймворк PureMVC?

Общая информация о фреймворке PureMVC, взятая с официального сайта http://puremvc.org/. Скоро ждите появления примера приложения, написанного с использованием PureMVC

Вольный перевод статьи с http://puremvc.org/content/view/67/178 

PureMVC – это фреймворк предназначенный для создания приложений базируемых на классической концепции Model, View и Controller.

Построенный при помощи design patterns это бесплатный, open source фреймворк, написанный на ActionScript 3 для совместного использования с Adobe Flex, Flash и AIR и был портирован на все известные платформы разработки.

Две версии фреймворка с руководством – Standard и MultiCore, хотя только версия Standard была портирована на другие языки более основательно

Версия Standard обеспечивает простую методику разделения вашего кода в соответствие концепции MVC. Версия MultiCore предназначена для многоразового использования PureMVC приложений запущенных внутри одной VM, модульного программирования.

Standart Version
Ряды приложений
Model, View и Controller представлены тремя Singletons (класс, где может быть создан только один экземпляр)

MVC Singletons обслуживаются так называемыми Proxies, Mediators и Commands, соответственно.
Façade и Singleton обеспечивают один интерфейс для повсеместных связей в приложении. Эти 4 Singletons так называемые Core Actors.

  • Data objects, могут быть локальными или удаленными, управляются Proxies.
  • View Components, создающие User Interface, управляются Mediators.
  • Commands, могут взаимодействовать с Mediators, обычно как триггер или исполнять другие Commands.

Все Actors обнаруживают и взаимодействуют друг с другом через Façade, быстрее, чем работая напрямую с Model, View и Controller.

PureMVC также вводит схему Publish/subscribe-style Observer notification. Это позволяет делать асинхронные управляемые взаимодействия между Actors системы и также обеспечивать связи между теми Actors, о которых пользователь не должен беспокоиться.

Standard Version Reference Implementation написан на ActionScript 3.

Multicore Version

Этот вариант поддерживает модульное программирование, позволяет использовать независимые программные модули, каждый из которых может содержать свой независимый PureMVC ‘Core’. Core (ядро) это четыре главных Actors, используемых в версии Standard фреймворка (Model, View, Controller и Facade). Эта версия фреймворка использует Multitons вместо Singletons. Вместо хранения одного образца класса Multiton хранит карту (map) образцов. Каждое Core (ядро) ссылается на ассоциируемый с ним Multiton Key.

MultiCore версия была разработана для поддержки модульного программирования в среде Rich Internet Applications, которые загружают и выгружают большие части функциональности в реальном времени. Для PDA приложений, которые должные динамически загружать и выгружать модули для управления списком задач, календарем, e-mail’ом, контактами и файлами.

MultiCore Version Reference Implementation написан на ActionScript 3.

Follow

Get every new post delivered to your Inbox.