Snow LeopardとLeopardの1つのコードベース
-
05-07-2019 - |
質問
背景
私は、Mac用のアプリケーションを作成するのに苦労している開発者です。 Snow Leopardを手に入れようとしています。今まで、私はLeopardで構築してきました。ココアの開発は約1年ほどで、それほど激しくありません。
私は特にSnow LeopardとGrand Central Dispatchについてたくさん読みました。ブロックを使用していることは承知していますが、ブロックの動作方法やGrand Central Dispatchの動作方法の核心には触れていません。
私の質問
Snow LeopardとLeopardの両方で1つのコードベースを開発し、Snow Leopardの新しいマルチスレッド機能を最大限に活用するにはどうすればよいですか?
NSOperationQueue
本能はコードでGCDを直接処理することではありませんが、Snow LeopardでNSOperationQueueを最大限に活用しているMike Ashes Q& Aセッションから読んだため、物事をキューに入れる必要がある場合はNSOperationQueueを使用しますGCDと彼がLeopardで発見したクラッシュを修正しました。
手動スレッド管理
ただし、特定のバックグラウンドスレッドの管理に関しては、Leopardの機能を損なうことなく、Snow Leopardの使いやすいスレッド管理機能を利用する方法はありますか?それとも、OSごとに異なるターゲットを持ち、それぞれにいくつかの異なるクラスがあることを勧めますか?私には、これはメンテナンスの悪夢のように思えます。
または、Snow Leopard向けにアプリを完全に最適化せずに、 +(void)detachNewThreadSelector:toTarget:withObject:
またはそれに類するものに固執しないで生活する必要があります。
人々はどう思いますか?
解決
GCDのあなたの腸の印象は正しいです。実際、Snow Leopardでのみ実行されるようにコードを条件付けしない限り、ブロックを使用するAPIはすべて使用できません。コードがSnow Leopardでのみ使用可能な機能をサポートする場合は理にかなっていますが、Leopardでもサポートする機能である場合は、すべての場合にLeopardのコードパスを使用して、Snow Leopard固有のユーザーに目に見える改善をもたらさないパスは、コードを複雑にし、テストのオーバーヘッドを増やすだけです。
これは、スレッド管理やGCDなどの場合に特に当てはまります。そこに加えられた変更には大幅な再アーキテクチャが必要です。それは単純ではありません:
if (snowLeopard) {
[NSSnazySnowLeopardClass doSomething];
} else {
[NSBoringLeopardClass doSomethingEquivalent];
}
一般に、変更が単純なAppleの場合、APIを変更せずにクラス内で変更を処理します。言い換えれば、問題はSnow Leopardでより簡単なスレッド管理コードを使用できるかどうかではなく、Leopardのハードバージョンを実行する必要がある場合に、なぜそうすべきなのかということです。追加のコードパスは追加のコードパスであり、Snow Leopardで大幅に異なるAPIを使用してLeopardのサポートを削除できるようになるまで(たとえLeopardのAPIよりも使いやすいとしても)余分な作業が必要です。
Leopardを本当にターゲットにしたいかどうかを考えます。 Snow Leopardの採用はかなり順調で、Snow Leopardは安価なアップグレードであり、APIの変更により、Snow Leopard専用アプリを実行している小規模な開発者からのユーザーに大きな圧力がかかります。長期間Leopardにとどまるユーザーのグループは、技術に精通していないユーザー(サードパーティ製ソフトウェアをインストールする可能性は低い)と、まだPPC Macを使用しているユーザー(新しいMacを購入していないユーザー)です。 3年後には、おそらくあまりソフトウェアを購入しないでしょう)。 3〜9か月で出荷されると思われるアプリの場合、Snow Leopardを使用するのはおそらく合理的なオプションであり、開発とテストの負担を大幅に削減できると主張します。
他のヒント
1つの方法は、GCDを使用するためにSnow Leopardで変更されたLeopardのAPIを理解することです。たとえば、LeopardのNSOperationとNSOperationQueueは、以前と同じように機能します。ただし、Snow Leopardでは、下のGCDを利用するように書き直されています。ボイルá。 10.6ユーザーのインスタントアップグレード。
別のオプションは、 PLBlocks などを使用して、GCDを自分のコードにコンパイルすることです。 。それがうまくいくかどうかはわかりませんが、一見の価値があるかもしれません。 =)