1

UIView アニメーションのように、通常のデリゲート パターンを非同期ブロックに変換したいと考えています。Apple が UIView アニメーションで行ったことをやりたい、このようなものに置き換えたい

[UIView beginAnimations:nil context:nil];
[UIview setAnimationDuration:0.25f];
[UIView setAnimationDidStopSelector:@selector(myStopSelector)];
[UIView setAnimationDelegate:self];

// Animation stuff

[UIView commitAnimations];

// In another part of my class

- (void)myStopSelector {

    // Completion stuff
}

このようなもので

[UIView animateWithDuration:0.25f animations:^{

    // Animation stuff

} completion:^(BOOL finished) {

    // Completion stuff
}]

私の場合、非同期操作を待っている間にこの動作が必要です。現在、特定のプロトコルをリッスンして操作を完了し、結果を得るオブザーバーを追加しています。TWRequest のように、デリゲート パターンを使用して非同期完了ハンドラー ブロックを使用することは避けたい

[myTWRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

}];

どうやってやるの?

どうもありがとう。

4

1 に答える 1

2

したがって、クラスは、ブロックをパラメーターとして受け取る 1 つまたは複数のメソッドを提供します。これらのブロックをメイン キュー、コンカレント バックグラウンド キュー、シリアル バックグラウンド キューのいずれで実行するかを決定する必要があります。後者の場合、クラスはこれらのキューを作成および管理する必要があります。

ブロックが実行されるのは、何らかのイベントの後、ブロックをコンテナに格納し、そのイベントがキューにキューに入れられたときです。または、キューを一時停止し、ブロックを追加して、イベントが発生したときにキューを再開できます。

デモ プロジェクトを作成し、既存のプロジェクトにコードを追加する前にこれらのアイデアを試してみることをお勧めします。GCD とブロックは豊富なツール セットを提供し、目標を達成するための多くのソリューションを作成できます。

編集:

リソース: Apple Docs: - 「グランド セントラル ディスパッチ (GCD) リファレンス」 - テクノロジーの奥深さと幅広さについての優れたアイデアを提供します。

  • 「並行性とアプリケーション設計」 - ほぼ同じ

  • 「ブロック プログラミング トピックス」

金曜日の Q&Aシリーズの Mike Ash は、ブロックとキューの使用に関する素晴らしい記事をいくつか書いています。

于 2012-08-22T12:10:44.057 に答える