1

XMLドキュメントの非同期リクエストを作成して解析するAFNetworkingクライアントオブジェクトを使用しています。

また、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.");

}

基本的に、フェッチが完了するまで関数が待機することを保証するために、上記の指定された領域にどのような種類のコードが必要か疑問に思っていますか?

今のところ、「FetchComplete」が表示されます。フェッチが完了する前にデバッグコンソールで。

TLHTTPClientクラスにBOOLフラグを追加してみました。

BOOL fetchingFlag;

そして試してみてください:

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

このクラスは通知を受信すると、RESTClient.fetchingFlag=FALSEを設定します。技術的にはwhileループを強制終了する必要がありますか?私のwhileループが無限に実行されることを除いて?!

4

2 に答える 2

2

基本的に、フェッチが完了するまで関数が確実に待機するようにするには、上記の指定された領域にどのようなコードが必要か疑問に思っていますか?

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

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

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

それはまさにそれがすでにどのように機能するかです。

于 2012-04-19T17:56:12.197 に答える
0

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

例として、-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 オブジェクトまたはエラーが返されます。

次のようにメソッドを呼び出すことができます。

- (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);    
        }
    }];
}

もちろん、この例では、AFNetworking の代わりに NSURLConnection の非同期メソッドのビルドを使用しましたが、一般的な考え方は理解できるはずです。

于 2012-04-19T17:29:04.380 に答える