NSOperationは非常に便利です。これを使用するには、NSOperationを拡張し、 "main"メソッドをオーバーライドします。 メインメソッドでは、計算/ Webリクエストなどを行います。したがって、NSOperationは、いくつかの簡単なステップにラップすることができるタスクに最適です。すべてのステップが良好で、次のステップに進むか、操作をキャンセルするかをテストします。これが完了すると、カスタムNSOperationをインスタンス化してNSOperationQueueオブジェクトに渡すだけで、スレッドの開始、クリーンアップの停止などを処理できます。
以下の例では、タスクの完了、通知を使用するのではなく、このアプローチをとることをお勧めします - 複数のオブジェクトが瞬時に通知される必要がある場合を除き、
はNSOperationクラスを拡張する新しいクラスを作成します。
NSOperationを拡張するオブジェクトがNSOperationQueue、NSOperationの「メイン」メソッドを呼び出そうと キューオブジェクトに追加され
//This object takes a "searchTerm" and waits to be "started".
#import <Foundation/Foundation.h>
@protocol ISSearchOperationDelegate
- (void) searchDataReady:(NSArray*) searchResult;
@end
@interface ISSearchOperation : NSOperation {
id <ISSearchOperationDelegate> delegate;
NSString *searchTerm;
}
@property(nonatomic, retain) NSString *searchTerm;
@property(nonatomic, assign) id delegate;
- (id) initWithSearchTerm:(NSString*) searchString;
@end
、あなたがしなければなりませんしたがって、この方法でタスクをラップします。 NSOperationクラス にはというプロパティがあります。isCancelledこのプロパティはNSOperationQueueで設定できるので、 if ifもテストする必要があります。それは、メインのあなたの完了時に設定されているおさらいに、あなたが望んでいたとして、各ステップが入った場合は、メインの内側からテストして、外部の何かがあなたの仕事をキャンセルした場合は、テストするので):。。
- (id) initWithSearchTerm:(NSString*) searchString {
if (self = [super init]) {
[self setSearchTerm:searchString];
}
return self;
}
- (void) main {
[self performSelector:@selector(timeOut) withObject:nil afterDelay:4.0];
if ([self isCancelled]) return;
NSData *resultData = [self searchWebServiceForString:self.searchTerm];
if (resultData == nil) return;
if ([self isCancelled]) return;
NSArray *result = [self parseJSONResult:resultData];
if ([self isCancelled]) return;
if (result == nil) return;
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[delegate performSelectorOnMainThread:@selector(searchDataReady:) withObject:result waitUntilDone:YES];
}
//私がmainの中で呼び出すすべてのメソッドの実装をコピーしていませんが、次のサブタスクを計算する前にそれぞれが正常に完了しなければならないことを理解してください。 最初にタイムアウトテストを入れてから、Webサービスから自分のデータを取得して解析しました。
これをすべて行うには、キューが必要です。
NSOperationQueue *q = [[NSOperationQueue alloc] init];
[self setQueue:q];
[q release];
- (void) doSearch:(NSString*) searchString {
[queue cancelAllOperations];
ISSearchOperation *searchOperation = [[ISSearchOperation alloc] initWithSearchTerm:searchString];
[searchOperation setDelegate:self];
[queue addOperation:searchOperation]; //this makes the NSOperationQueue call the main method in the NSOperation
[searchOperation release];
}
//the delegate method called from inside the NSOperation
- (void) searchDataReady:(NSArray*) results {
//Data is here!
}
NSOperationsと利点のいくつかがあることは、発信者の観点から次のとおりです。どこかにキューを設定
:あなたはあなたがこれを行う。この操作のためのデリゲートになりたいクラスでそう
私たちは単にオブジェクトを作成し、デリゲートを設定し、応答を待ちます。しかし、舞台裏では、いつでも取り消すことができる一連のスレッド化されたタスクが実行され、スレッド化されたものが失敗した場合に対処できる方法で実行されます。
doSearchメソッドでわかるように、前の操作をキャンセルすることから始めます。ユーザーが単語を入力するたびにWebサービスを検索するアプリでこれを行いました。つまり、ユーザーが「hello world」を検索した場合、「h」、「he」、「hel」、「hell」、「hello」などの検索を行います。 私は停止していきたい NSOperationは、スレッディングの応答性をもたらし、通常は多くのスレッドを生成する混乱の唯一の方法であることが判明しましたが、ユーザーが "e"をタイプするとすぐに "h"
ご希望の場合は、ご利用ください。