6

背景

我是一名正在为 Mac 构建应用程序而苦苦挣扎的开发人员。我即将接触到雪豹。到目前为止,我一直在 Leopard 上进行构建。我只做了大约一年的 Cocoa 开发,并不是很紧张。

我读过很多关于雪豹和大中央调度的文章。我知道它使用积木,但我没有深入了解积木的工作原理或 Grand Central Dispatch 的工作原理。

我的问题

我如何最好地为 Snow Leopard 和 Leopard 开发一个代码库,同时最大限度地利用 Snow Leopard 中新的多线程功能?

NSOperationQueue

我的直觉不是直接在我的代码中处理 GCD,但是当需要放入队列时,请使用 NSOperationQueue,因为我从 Mike Ashes 问答环节中读到,在 Snow Leopard 中,NSOperationQueue 充分利用了 GCD 和他的崩溃者在 Leopard 中发现的问题现已修复。

手动线程管理

但是,当涉及到管理特定的后台线程时,有没有办法利用 Snow Leopard 中更易于使用的线程管理功能而不破坏 Leopard 中的东西?还是人们会建议我为每个操作系统设置不同的目标,每个操作系统都有不同的类?这对我来说似乎是一场等待发生的维护噩梦。

或者,也许我应该忍受没有针对 Snow Leopard 完全优化我的应用程序并坚持使用+(void)detachNewThreadSelector:toTarget:withObject:或类似的东西。

人们怎么想?

4

2 回答 2

9

您对 GCD 的直觉印象是正确的。事实上,任何使用块的 API 都已被淘汰,除非您将该代码设置为仅在 Snow Leopard 上运行。如果代码要支持仅在 Snow Leopard 上可用的功能,这是有道理的,但如果它是您也将在 Leopard 上支持的功能,您最好在所有情况下都使用 Leopard 代码路径,添加特定于 Snow Leopard没有为用户提供任何可见改进的路径只会使您的代码复杂化并增加您的测试开销。

这尤其适用于线程管理或 GCD 之类的东西。那里的变化需要大量的重新架构,这不仅仅是:

if (snowLeopard) {
  [NSSnazySnowLeopardClass doSomething];
} else {
  [NSBoringLeopardClass doSomethingEquivalent];
}

一般来说,如果更改很简单,Apple 在类内部处理它们而不更改 API。换句话说,问题不在于您是否可以在 Snow Leopard 中使用更简单的线程管理代码,而是当您无论如何都需要为 Leopard 执行硬版本时,为什么要这样做。额外的代码路径就是额外的代码路径,直到您可以在 Snow Leopard 上使用明显不同的 API(即使它们比 Leopard 更易于使用)放弃 Leopard 支持,这只是额外的工作。

我会考虑你是否真的想瞄准 Leopard。Snow Leopard 的采用一直是公平的,Snow Leopard 是一种廉价的升级,并且由于 API 的变化,小型开发人员仅使用 Snow Leopard 应用程序会给用户带来很大的前向压力。唯一会长期使用 Leopard 的用户是那些技术不熟练的用户(他们不太可能安装很多 3rd 方软件),以及仍在使用 PPC Mac 的用户(还没有购买新的 Mac在 3 年内,所以可能不会购买太多软件)。如果它是您认为将在 3-9 个月内发布的应用程序,我认为仅使用 Snow Leopard 可能是一个合理的选择,并且将大大减轻您的开发和测试负担。

于 2009-10-22T14:32:55.677 回答
2

一种方法是了解 Leopard 中的哪些 API 已在 Snow Leopard 中进行了修改以使用 GCD。例如,Leopard 中的 NSOperation 和 NSOperationQueue 像往常一样工作。然而在 Snow Leopard 中,它们已被重写以利用底层的 GCD。瞧。为您的 10.6 用户即时升级。

另一种选择是使用PLBlocks 之类的东西并自己将 GCD 编译到您的代码中。我不知道这是否可行,但它可能值得一试。=)

于 2009-10-22T15:07:41.023 回答