プラグイン システムを使用してアプリケーションを作成しています。プラグインはメイン スレッドで動作する必要があります (これは質問の一部ではありません。この要件を削除する必要があるという回答をたくさん探しているわけではありません)。
プラグインは非同期で初期化されるため、起動時に UI が数秒間ハングすることはありませんが、他のコードは起動後すぐにプラグインとの対話を開始します。これは明らかに、プラグインのロードが完了するまで遅らせる必要があります。
これが私がこれまでに得たものです...
// Create operation queue
dispatch_queue_t queue = dispatch_queue_create(...);
dispatch_suspend(queue);
// Load the plugins
dispatch_group_t group = dispatch_group_create();
for each plugin {
dispatch_group_async(group, dispatch_get_main_queue(), ^{
load...
});
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
dispatch_resume(queue);
});
// Add operations that interact with the plugins
dispatch_async(queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
operation...
});
});
これは、送信された操作はプラグインのロードが完了するまで開始されないことを意味しますが、新しい操作は実際に処理される前に 2 つのキューを通過します。これは大きなオーバーヘッドですか?最初にキューに入れ、キューイングを気にしないメソッドの実装の準備ができたら、メソッドの実装を交換する価値はありますか? これを行うのはよりトリッキーであり、それだけの価値があるかどうかはわかりません。
最後に、この種の問題に適した設計パターンはありますか? おそらく、依存関係のある NSOperations と NSOperationQueues を使用する必要がありますか? それとも、基本的な GCD 操作よりもオーバーヘッドが高くなりますか?