代码之家  ›  专栏  ›  技术社区  ›  John Gallagher

雪豹和雪豹的一个代码库

  •  6
  • John Gallagher  · 技术社区  · 15 年前

    背景

    我是一个正在为Mac构建应用程序的开发人员。我要去抓雪豹了。直到现在,我一直在用豹做建筑。我只做了大约一年的可可开发工作,时间不长。

    我读了很多关于雪豹和大中央特派的书。我知道它使用块,但我不了解块是如何工作的,也不了解GrandCentralDispatch是如何工作的。

    我的问题

    如何最好地为雪豹和豹开发一个代码库,同时最大程度地利用雪豹中新的多线程技术?

    操作队列

    我的直觉不是在我的代码中直接处理gcd,而是当事情需要排队时,使用nsOperationQueue,因为我已经阅读过mike ash q&a会话,在雪豹中,nsOperationQueue充分利用了gcd,他在豹中发现的崩溃程序现在已经修复。

    手动线程管理

    然而,当涉及到管理特定的后台线程时,是否有任何方法可以利用雪豹中易于使用的线程管理工具而不破坏雪豹中的内容?或者人们会建议我为每个操作系统设置不同的目标,每个操作系统中有不同的类?对我来说,这就像是一场等待发生的维护噩梦。

    或者也许我应该活在没有让我的应用程序完全为雪豹优化和坚持 +(void)detachNewThreadSelector:toTarget:withObject: 或者类似的东西。

    人们怎么想?

    2 回复  |  直到 15 年前
        1
  •  9
  •   Louis Gerbarg    15 年前

    你对GCD的直觉是正确的。事实上,任何使用块的API都是不存在的,除非您将代码条件化为只在雪豹上运行。如果代码要支持仅在Snow Leopard上可用的功能,这是有意义的,但是如果它是您也要在Leopard上支持的功能,那么您也可以在所有情况下都使用Leopard代码路径,添加一个不向用户提供任何可见改进的Snow Leopard特定路径只会使代码A复杂化。增加你的测试开销。

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

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

    一般来说,如果更改是简单的Apple在类中处理它们而不更改API。换句话说,问题不在于是否可以在SnowLeopard中使用更简单的线程管理代码,而是为什么在需要为Leopard执行硬版本时应该这样做。一个额外的代码路径是一个额外的代码路径,并且直到您可以在雪豹上使用显著不同的API(即使它们比雪豹的API更容易使用)放弃对雪豹的支持,这只是额外的工作。

    我会考虑你是否真的想瞄准豹。雪豹的采用一直是公平的,雪豹是一个便宜的升级,而且由于API的变化,将有很多来自小开发者做雪豹专用应用程序的用户的前进压力。唯一一批长期待在Leopard上的用户是那些不懂技术的用户(他们不太可能安装很多第三方软件)和那些仍在使用PPC Mac的用户(他们三年来没有购买新的Mac,所以可能不会购买太多软件)。如果这是一个应用程序,你认为将在3-9个月内发货,我会争辩说,只去雪豹可能是一个合理的选择,并将大大减少你的开发和测试负担。

        2
  •  2
  •   Dave DeLong    15 年前

    一种方法是了解在雪豹中,哪些API被修改为使用GCD。例如,Leopard中的nsOperation和nsOperationQueue一直工作。然而,在雪豹身上,它们已经被重写以利用下面的GCD。VoRE为您的10.6用户进行即时升级。

    另一种选择是使用 PLBlocks 并自己将gcd编译成代码。我不知道这样行不行,但也许值得一试。=)