在单独的帖子中做什么?

时间:2010-10-24 14:40:07

标签: iphone objective-c performance ios nsoperation

所以我已经阅读了一些有关多线程和NSOperation的内容,并想知道如何使用它来改进我的应用程序。使用乐器我已经隔离了一些我的应用程序绝对可以使用速度改进的地方。我的问题是,这些类型的东西是否适合使用NSOperation的另一个线程?

绘制视图:我有一个相当复杂的视图,需要花一点时间来绘制。当它被绘制时,我会遇到一些滞后。

分配和播放音频:我正在使用AVAudioPlayer播放一些背景音乐。当我分配它时,又一些滞后。

计算:我也在进行一些计算,并对许多整数进行一些比较。

我努力为我的应用程序提供最佳性能,那么你会做什么?

3 个答案:

答案 0 :(得分:5)

UI更新不适用于后台线程。所有UI更新始终需要在主线程上完成。如果您的视图需要花费太多时间来渲染,请考虑重构,预渲染和缓存或其他一些优化方法。

音频代码可以基于后台,但不应该那么昂贵

计算绝对可以毫无后顾之忧。

答案 1 :(得分:4)

我同意后台线程不是UI更新的事情。由于用户在等待UI向他们展示正在发生的事情时被“阻止” - 从逻辑的角度来看它没有意义 - 并且它可能导致其他编码问题。

我发现后台线程的最大的事情通常与异步操作有关。 (想想一个AJAX网页)。如果您希望您的用户能够在正在进行某些操作时与进行交互。一个很好的例子就是从网上搜索,更新和获取任何类型的数据。

即使你正在进行任何你认为应该同步的网络操作 - (比如从网站加载消息) - 你很可能想要异步地处理它 因为你不知道什么样的网络条件会导致它花费很长时间 - 也许最终会超时或失败。 (记录音频之类的东西也会像这样工作)。

即使您在从Web上读取此类同步数据时想要阻止您的应用程序,您仍可能希望异步执行此操作 - 所以你可以在后台线程中加载数据 - 当你给出进度条,微调器(进度)控件或允许用户点击前景中的“取消”按钮时UI线程。

将“异步”请求视为需要较长时间的请求 - 或者您无法确定需要多长时间。

答案 2 :(得分:3)

一些UI绘图方法在iOS 4.0中是线程安全的:

  

来源:Apple dev: What's new in iOS: iOS 4.0

     

在UIKit中绘制图形上下文现在是线程安全的。具体做法是:

     
      
  • 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。
  •   
  • 字符串和图像绘制现在是线程安全的。
  •   
  • 现在可以安全地使用多个线程中的颜色和字体对象。
  •   

我发现我的应用程序通常从后台线程中受益最多:

  • 从网上下载内容
  • 对数据库进行昂贵的查询(读/写)
  • 长时间运行算法

如果您确定决定背景某些任务,我建议使用NSOperation和NSOperationQueue,因为它们会简化很多事情。有点学习曲线,但绝对值得!

祝你好运!