2012-04-19 9 views
1

私は、AFnetworkingクライアントオブジェクトを使用しています。このオブジェクトは、XMLドキュメントに対して非同期要求を行い、解析します。NSNotificationCenter - メインスレッドをブロックせずに通知を送信するのを待つ方法?

また、文書の解析が完了したときに通知をポストするには、NSNotificationCenterを使用してください。

は、メインスレッドをブロックせずに通知するためにを待つ方法がありますか?

例えばコード:

-(void)saveConfiguration:(id)sender { 

    TLHTTPClient *RESTClient = [TLHTTPClient sharedClient]; 

    // Performs the asynchronous fetching....this works. 
    [RESTClient fetchActiveUser:[usernameTextField stringValue] withPassword:[passwordTextField stringValue]]; 

    /* 
    * What do I need here ? while (xxx) ? 
    */ 

    NSLog(@"Fetch Complete."); 

} 

は基本的に私は思ったんだけど、私がするまでを待つ機能がフェッチ完了したことを確認するために、上記の指定された領域に必要なコードの種類を?

今のところ、「フェッチが完了しました」と表示されます。フェッチが完了する前にデバッグコンソールでを実行してください。

IはTLHTTPClientクラスにBOOLフラグを追加しようとした:

BOOL fetchingFlag; 

を、次にしよう:

while([RESTClient fetchingFlag]) { NSLog(@"fetching...); } 

このクラスは、それがRESTClient.fetchingFlag = FALSEを設定する通知を受信します。それは技術的にwhileループを殺すべきでしょうか?私のwhileループは無限に実行されます。

+0

別のスレッドで待つことができますか? – MechEthan

+0

別のスレッドで解析することができます – Kamal

+7

通知のために登録すると、メインスレッドをブロックせずに既に待機しています。 –

答えて

2

基本的には、上記の指定された領域で、フェッチが完了するまで関数が待機することを確認するために必要なコードがありますか?

コードなしが必要です。フェッチを開始した後は、メソッドに何も入れないでください。何も起こりません。通知が受信されるまで、プログラムは「待機」します(実際には他の入力を処理しています)。

通知ハンドラのメソッドには、フェッチが完了したときに行う必要があるすべてのものを入れてください。これは、通知や他のコールバックスキームのポイントの1つです。あなたのオブジェクトは、それが動作する時であることの通知を得るまで、それ以上何もしません。

メインスレッドをブロックせずに通知が送信されるのを待つ方法はありますか?

これはまさにそれがどのように機能しているかを示しています。

+0

あなたが言ったことと、私が達成しようとしていることを正確に再考した後で、自分のコードを再検査すると、あなたは本当に正しいです!ありがとう! –

+0

うれしい私は助けることができます。 –

0

タスクの完了時に複数のオブジェクトに通知する必要がない場合は、完了ハンドラ(objcブロック)を-fetchActiveUser:withPassword:メソッドに追加することができます(-fetchActiveUser:withPassword:completionHandler:のようになります)。 。

- (void)fetchActiveUser:(NSString *)user 
      withPassword:(NSString *)pass 
     completionHandler:(void (^)(TLUser *user, NSError *error))handler 
{ 
    NSURL *URL     = [NSURL URLWithString:@"http://www.website.com/page.html"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];  
    NSOperationQueue *queue  = [NSOperationQueue currentQueue]; 
    [NSURLConnection sendAsynchronousRequest:request 
             queue:queue 
          completionHandler:^ (NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if (!handler) 
     { 
      return 
     }; 

     if (data) 
     { 
      TLUser *user = [TLUser userWithData:data]; 

      if (user) 
      { 
       handler(user, nil); 
      } 
      else 
      { 
       NSError *error = // 'failed to create user' error ... 
       handler(nil, error); 
      } 
     } 
     else 
     { 
      handler(nil, error); 
     } 
    }]; 
} 

タスクが終了するたびに完了ハンドラが呼び出されますそれはTLUserオブジェクトまたはエラーが返されます、次のいずれか。完了ハンドラ

の例では、あなたの-fetchActiveUser:withPassword:completionHandler:方法は、以下のように見えると言うことができます何かが間違っていた場合(接続不良、データ構文解析中にフォーマットが変更されたなど)。

あなたは、このようなメソッドを呼び出すことができるようになります。この例では、私はAFNetworkingの代わりにNSURLConnectionの非同期メソッドでビルドを使用しましたが、あなたはできるはずです。もちろん、

- (void)saveConfiguration:(id)sender 
{ 
    TLHTTPClient *RESTClient = [TLHTTPClient sharedClient]; 


    // Performs the asynchronous fetching 

    [RESTClient fetchActiveUser:[usernameTextField stringValue] 
        withPassword:[passwordTextField stringValue] 
       completionHandler:^ (TLUser *user, NSError *error) 
    { 
     if (user) 
     { 
      NSLog(@"%@", user); 
     } 
     else 
     { 
      NSLog(@"%@", error);  
     } 
    }]; 
} 

一般的な考えを得るために。

関連する問題