2010-12-14 8 views
0

NSURLConnectionを使用して受信したものを検索するために検索バーを作成しようとしています。 今、私が何かを検索すると、その文字列は非同期要求を持つURLとして送信され、私にデータを与えます。データが解析され、それが成功したとき、私は通知NSOperationを使用した検索

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
    {  
     xmlParser = [[NSXMLParser alloc] data]; 
     [xmlParser setDelegate:xmlGeocoder]; 
     BOOL success = [xmlParser parse]; 

     if(success == YES){ 
      NSLog(@"No Errors"); 

      [[NSNotificationCenter defaultCenter] postNotificationName:@"getArray" object:self]; 

     }else{ 
      NSLog(@"Error Error Error!!!"); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"failToGetArray" object:self]; 
     } 
} 

を投稿し、私のsearchresultsTableViewがリロードされていること

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; 
    [theConnection cancel]; 
    [theConnection release]; 

theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

これらの方法はお互いに依存しているため、Aがまだビジー状態のときはBを実行できません。 NSNotificationCenterを使用して、それらのコードを実行するように指示しています。

しかし、私はNSOperationを試してみたいと思います。実装する方法はわかりません。 私の検索要求は、操作や使用しているすべての方法で入れなければなりませんか?

誰かにサンプルコードを渡して、これをどのように行うべきか考えてもらえますか? ありがとうございます...

答えて

2

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"

ご希望の場合は、ご利用ください。

関連する問題