显示包含在大型XML文档中的数据

时间:2011-05-20 15:15:07

标签: xml flash actionscript-3

我有一个大型的Flash项目,我正在试图找出处理它的最佳方法。我想加载组及其成员的XML文件,以及与每个组及其各自成员相关的一组属性 - 但这些组和成员仅在用户单击其父组后显示在屏幕上。我的第一个想法是只为组织和用户的整个树提取XML,然后为组分配影片剪辑,并附加与其显示相关的属性以及用户如何与它们交互 - 但是如果它们可能永远不会出现在屏幕,这样做是没有意义的吗?我如何最好地构建这个项目?构建一个对象并仅将属性附加到该对象,然后仅在单击时添加显示数据?

我已经尝试过一次这样的建筑,但是在中途变得太笨重了,所以我想以坚实的方式开始新鲜事。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

我要做的是加载XML并将其缓存在未解析的模型级别上,以消除用户交互的加载时间,但是在点击时进行所有解析,创建和渲染以按需进行。

答案 1 :(得分:1)

因此,对这类问题没有“一个真实的答案”;但是我可以就如何处理这个问题给你一些建议。

首先,您需要加载和解析整个XML文档;您将希望在一次传递中将数据转换为ActionScript 3对象(也称为模型对象),然后丢弃XML对象;这样做的原因是因为accessing properties of an XML Object in AS3 is very, very slow。编写解析器非常简单; (顺便说一句:我在marshalling data to and from XML上写了一篇相当深入的博客文章);为了这个答案,让我们假设你有一个看起来像这样的XML文档:

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

最本地的模型对象图将包含Group模型和Member模型,例如:

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中;改进encapsulation

所以,至于显示它们 - 这取决于你计划如何向用户展示它们。我同意你不要过分夸大并提前创建与会员相关的所有DisplayObject,如果它们有很多,或者由于其复杂性而导致DisplayObject的制作成本很高。

您可以采取一些方法,通过对内容进行分页,您可以使用ItemRenderer样式方法,只在需要时才创建实例。另一种选择是使用具有可重置的View对象,可将其放入ObjectPool以供以后重复使用。你最终会采用哪种方法,我会建议牢记黄金法则 - 保持简单 - 让它先工作然后再担心性能和内存使用情况。

最后,如果没有提到有适当的框架来帮助解决这些类型的架构问题,那将是我的疏忽,最受欢迎的两个问题是PureMVCRobotLegs;如果你有兴趣改进你的手艺,我建议你花点时间学习它们的工作原理。