背景

我是开发人员,他正在为Mac构建应用程序。我即将抓住Snow Leopard。到目前为止,我一直在使用Leopard。我只做了大约一年的可可开发而不是非常强烈。

我特别喜欢Snow Leopard和Grand Central Dispatch。我知道它使用了块,但我还没有深入了解块如何工作或者Grand Central Dispatch如何工作。

我的问题

如何最好地为Snow Leopard和Leopard开发一个代码库,同时充分利用Snow Leopard中新的多线程内容?

<强> NSOperationQueue

我的直觉不是直接在我的代码中处理GCD,但是当需要放置队列时,请使用NSOperationQueue,因为我已经阅读了来自Snow Leopard的Mike Ashes Q&amp; A会话,NSOperationQueue充分利用了GCD和他在Leopard中发现的破坏者现在已经修复了。

手动线程管理

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

或者我可能只是没有让我的应用程序完全针对Snow Leopard进行优化,并坚持使用 +(void)detachNewThreadSelector:toTarget:withObject:或类似的东西。

人们的想法是什么?

有帮助吗?

解决方案

你对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是一个廉价的升级版本,并且由于API的变化,来自小型开发人员的用户将面临很大的前进压力,他们只使用Snow Leopard应用程序。将长期留在Leopard上的唯一一组用户是那些技术不精通(不太可能安装太多第三方软件)的用户,以及那些仍在使用PPC Mac(未购买新Mac)的用户在3年内,所以可能不会购买太多软件)。如果它是一个你认为将在3-9个月内发售的应用程序,我认为只使用Snow Leopard可能是一个合理的选择,并将大大减少你的开发和测试负担。

其他提示

一种方法是了解Leopard中的哪些API已经在Snow Leopard中被修改为使用GCD。例如,Leopard中的NSOperation和NSOperationQueue一如既往地工作。但是在Snow Leopard中,它们已经被重写以利用下面的GCD。 Voil&#225 ;.为您的10.6位用户即时升级。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top