6

バックグラウンド

私はMac用のアプリケーションを構築することに苦しんでいる開発者です。ユキヒョウを手に入れようとしています。今まで私はLeopardをベースに構築してきました。私はCocoaの開発を約1年しか行っていませんが、それほど集中的ではありません。

特にSnowLeopardとGrandCentralDispatchについてたくさん読んだことがあります。ブロックを使用していることは承知していますが、ブロックの仕組みやGrandCentralDispatchの仕組みについては詳しく説明していません。

私の質問

Snow Leopardの新しいマルチスレッド機能を最大限に活用しながら、Snow LeopardとLeopardの両方に対して1つのコードベースを開発するにはどうすればよいですか?

NSOperationQueue

私の本能は、コードでGCDを直接処理することではありませんが、キューに入れる必要がある場合は、NSOperationQueueを使用してください。SnowLeopardのMike Ashes Q&Aセッションから、NSOperationQueueはGCDとクラッシャーを最大限に活用していることがわかりました。 Leopardで発見されたものが修正されました。

手動スレッド管理

ただし、特定のバックグラウンドスレッドの管理に関しては、Leopardの機能を壊すことなく、Snow Leopardの使いやすいスレッド管理機能を利用する方法はありますか?または、OSごとに異なるターゲットを設定し、それぞれに異なるクラスを設定することをお勧めしますか?これは私には、メンテナンスの悪夢のように思えます。

あるいは、アプリがSnow Leopard用に完全に最適化されていない状態で生活し、それに固執する必要があるかもしれません+(void)detachNewThreadSelector:toTarget:withObject:

人々はどう思いますか?

4

2 に答える 2

9

GCDに対するあなたの腸の印象は正しいです。実際、Snow Leopardでのみ実行するようにコードを条件付けしない限り、ブロックを使用するAPIはすべて使用できません。コードがSnowLeopardでのみ利用可能な機能をサポートする場合は理にかなっていますが、Leopardでもサポートする機能である場合は、すべての場合にLeopardコードパスを使用して、SnowLeopard固有の機能を追加することをお勧めします。ユーザーに目に見える改善をもたらさないパスは、コードを複雑にし、テストのオーバーヘッドを増加させるだけです。

これは特にスレッド管理やGCDのようなものに当てはまります。そこでの変更には、大幅な再アーキテクチャが必要です。それは単純ではありません。

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

一般に、変更が単純なものである場合、AppleはAPIを変更せずにクラス内でそれらを処理します。言い換えれば、問題はSnow Leopardでより簡単なスレッド管理コードを使用できるかどうかではなく、とにかくLeopardのハードバージョンを実行する必要があるときになぜそうすべきなのかということです。追加のコードパスは追加のコードパスであり、Snow Leopardで大幅に異なるAPIを使用してLeopardサポートを削除できるようになるまでは(Leopardよりも使いやすい場合でも)追加の作業になります。

本当にLeopardをターゲットにしたいかどうかを考えます。Snow Leopardの採用はかなり進んでおり、Snow Leopardは安価なアップグレードであり、APIの変更により、SnowLeopardのみのアプリを実行している小規模な開発者からのユーザーに多くの前向きなプレッシャーがかかるでしょう。Leopardに長期間滞在するユーザーのグループは、技術に精通していないユーザー(サードパーティのソフトウェアをインストールする可能性が低い)と、PPC Macをまだ使用しているユーザー(新しいMacを購入していないユーザー)だけです。 3年間で、おそらく多くのソフトウェアを購入していません)。3〜9か月で出荷されると思われるアプリの場合、Snow Leopardのみを使用するのがおそらく妥当なオプションであり、開発とテストの負担を大幅に削減できると思います。

于 2009-10-22T14:32:55.677 に答える
2

1つの方法は、GCDを使用するためにLeopardのどのAPIがSnowLeopardで変更されたかを理解することです。たとえば、LeopardのNSOperationとNSOperationQueueは、いつものように機能します。ただし、Snow Leopardでは、下のGCDを利用するように書き直されています。Voilá。10.6ユーザー向けのインスタントアップグレード。

もう1つのオプションは、 PLBlocksのようなものを使用して、GCDを自分でコードにコンパイルすることです。それがうまくいくかどうかはわかりませんが、一見の価値があるかもしれません。=)

于 2009-10-22T15:07:41.023 に答える