Отображение данных, содержащихся в большом документе XML - PullRequest
0 голосов
/ 20 мая 2011

У меня большой флеш-проект, и я пытаюсь найти лучший способ справиться с ним. Я хочу загрузить в XML-файл группы и их членов, а также набор атрибутов, связанных с каждой группой и ее соответствующими членами, - но эти группы и члены отображаются на экране только после того, как пользователь нажимает на их родительские группы. Моей первой мыслью было просто вставить XML для всего дерева групп и пользователей, затем назначить видеоклипы для групп и прикрепить свойства, связанные с их отображением и тем, как пользователь будет взаимодействовать с ними - но если они могут никогда не появиться на экран, это бессмысленно делать? Как мне лучше структурировать этот проект? Создать объект и прикрепить свойства только к объекту, а затем добавить отображаемые данные только при нажатии?

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

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Что бы я сделал, это загрузил бы XML и кэшировал его на уровне модели без разбора, чтобы исключить время загрузки при взаимодействии с пользователем, но выполнял весь анализ, создание и рендеринг по щелчку, чтобы сделать его по требованию.

1 голос
/ 21 мая 2011

Так что нет единого правильного ответа на этот вопрос;однако я могу предложить вам несколько советов о том, как мне решить эту проблему.

Прежде всего вам потребуется загрузить и проанализировать весь XML-документ;вы захотите получить данные, преобразованные в объекты ActionScript 3 (объекты модели) за один проход, а затем отбросить объект XML;причина в том, что доступ к свойствам объекта XML в AS3 очень, очень медленный .Написание парсера довольно просто;(Кстати: я написал довольно глубокое сообщение в блоге о сортировке данных в и из XML );ради этого ответа давайте предположим, что у вас есть XML-документ, который выглядит примерно так:

<group name="AS3 Developers">
    <member name="jonnyreeves" rep="440" />
    <member name="mheavers" rep="243" />
</group>

Наиболее локальный граф объекта модели будет состоять из Group Model и Member ModelНапример:

public class Group {
    public var name : String;
    public var members : Array; /* of Member objects */
}

public class Member {
    public var name : String;
    public var rep : uint;
}

После того, как ваш синтаксический анализатор поработал над XML-документом, у вас останется массив объектов Group;затем его следует сохранить в новой модели, которая может предоставить вам быстрый и легкий доступ к содержащимся в нем данным:

public class GroupListModel {
    private var _groups : Array;

    public function GroupListModel(groups : Array) {
        _groups = groups;
    }

    public function getGroup(name : String) : Group {
        // TODO Use a lookup table here instead.
        for each (var group : Group in _groups) {
            if (group.name == name) {
                return group;
            }
        }
        return null;
    }

    public function getMembersWithRepGreaterThan(value : uint) : Array {
        const result : Array = [];
        for each (var group : Group in _groups) {
            for each (var member : Memeber in group) {
                if (member.rep > value) {
                    result.push(member);
                }
            }
        }
        return results;
    }
}

Таким образом, вы можете сохранить все методы поиска (и модификации) внутри GroupListModel;улучшение инкапсуляция .

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

Существует несколько подходов, которые вы можете использовать, разбивая содержимое на страницы, которое вы можете использовать в стиле ItemRenderer , где экземпляры создаются только тогда, когда они требуются.Другой вариант - использовать сбрасываемые объекты View, которые можно поместить в ObjectPool для последующего повторного использования.Какой бы подход вы ни использовали в конечном итоге, я бы рекомендовал помнить о золотом правиле - «Не усложняйте» - сначала включите его, а потом заботитесь о производительности и использовании памяти.

Наконец, было бы упущением для меняне говоря уже о том, что существуют фреймворки для решения таких архитектурных проблем, наиболее популярными из которых являются PureMVC и RobotLegs ;Я предлагаю вам потратить некоторое время на изучение того, как они работают, если вы заинтересованы в улучшении своего ремесла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...