代码之家  ›  专栏  ›  技术社区  ›  Jake

iPhone网络性能

  •  0
  • Jake  · 技术社区  · 17 年前

    我有一个问题,我非常愿意接受建议(即使是非常奇怪的建议!)

    我正在编写一个iPhone应用程序,它向服务器发出请求(带有参数的URL)。作为响应,iPhone接收XML。一切都很好。

    现在,我希望通过测量执行某些任务所需的时间来提高应用程序的速度。我发现,在执行的所有任务(下载、XML解析、发送请求、处理请求、从XML解析对象)中,下载实际的XML花费的时间最长。

    现在,我的XML文件非常、非常、非常简单,而且非常、非常、非常小。我主要使用它们来读取类似RSS的数据,并在UITableView中显示它们。

    我的应用程序运行得很好,没有什么感觉很慢,但现在应用商店中有一个应用程序,它的功能与我的应用程序非常相似,但是速度更快,感觉更“快”,如果你知道我的意思的话。它还有一个很好的功能,可以从RSS提要中逐个加载标题。

    目前我正在尝试对数据进行gzip压缩,但这种压缩只会使数据大小减少一半,而且似乎对性能没有任何实际好处。最重要的是,在解析数据之前,必须先下载数据。如果有一个“流”的数据,当它进入时被解析,那将是非常酷的。这样,我几乎可以同时完成两项工作,并一个接一个地加载标题(使用户交互更具吸引力)。

    有人知道如何提高我的表现吗?无论是通过出色的压缩技巧,还是通过完全不同的方式与服务器通信。。欢迎光临!

    更新:把服务器的延迟和响应放在一边;如何将XML源“流式”传输到iPhone(逐字节下载)并同时进行解析?目前,这是一个线性下载过程->解析->显示,但通过下载&同时解析(并在下载完成时显示每个项目,而不是在UITableView中同时加载所有项目)

    4 回复  |  直到 17 年前
        1
  •  3
  •   Mark Bessey    17 年前

    假设您使用的是NSXMLParser的initWithContentsOfURL:,这可能是问题的一部分。似乎是下载URL的全部内容,然后将其交给解析器一次解析所有内容。

    另一种方法是使用NSURLConnection,在NSURLConnection的委托的connection:didReceiveData:method中创建一个新的NSXMLParser,并在每次传入数据时重新解析数据。您必须编写一些额外的代码来忽略多次重新解析文件开头的额外事件。

    这似乎比获取其他库并对其进行调整要复杂得多,但可能不是,这取决于您如何处理表数据的下游创建。

        2
  •  1
  •   Martin Redmond    17 年前

    如果NSMutableArray是UITableView的底层数据结构,则应尝试 使用initWithContentsOfURL。服务器上的格式需要使用易于生成的Apple“plist”xml。我猜如果cocoa已经获得了 处理xml使用它们比创建自己的xml解析器实例更快。

        3
  •  0
  •   Kendall Helmstetter Gelner    17 年前

    这也意味着数据压缩会适得其反。

    对于非常少量的XML,速度问题可能与连接延迟有关。

    因此,另一个重要因素可能是DNS查找。您可以事先自己做一次,然后缓存IP,也许只在连接到服务器失败时重新检查。。。

        4
  •  0
  •   Ben Gotow Dmitry Nogin    17 年前

    因为您的xml文件非常小(我想大概只有8k左右),所以我认为您在解析它们时不会看到很大的性能提升。您可以使用异步NSURLConnection来实现这一点,但我看不出它对小文件有多大帮助。您是否考虑过在服务器上生成XML文件所需的时间?您是使用PHP创建XML还是访问静态文件?出于测试目的,访问静态文件并查看它们之间的比较可能会很有趣。

    不久前我遇到了这样的问题,结果发现我服务器上的mySQL数据库速度很慢,这与我的应用程序毫无关系。

    另外,在下载和解析XML文档时,使用工具查看分配的内存量。一些XML解析器将整个XML文档加载到内存中,然后允许您随机索引到文档的元素中,而其他解析器只提供逐步解析。对于像iPhone这样的有限设备,循序渐进的方法要好得多,这可能是您正在使用的,但快速查看内存消耗情况应该会告诉您。