0

これはおそらく、ブロックの理解と、おそらく NSOperationQueue がいつどのように動作するかについての理解と関係がありますが、とにかく尋ねます:

私は基本的なフェッチリクエストメソッドを持っています:

- (void)fetchActiveUser:(NSString*)username withPassword:(NSString *)password {

    [self setAuthorizationHeaderWithUsername:username password:password];

    // SETS FLAG that we are performing a request
    fetchModeActive = TRUE;

    [self getPath:kTLActiveUserURI parameters:nil success:^(AFHTTPRequestOperation 
      *operation, id responseObject) {

    if ([responseObject isKindOfClass:[NSXMLParser class]]) {
        TLPersonParser *personParser = [[TLPersonParser alloc] 
          initWithParser:responseObject];

        [personParser setDelegate: self];
        [personParser parsePeople];

        [personParser release];

    }
    // handle stuff here.
    NSLog(@"Success!");
    fetchModeActive = FALSE;
    [[NSNotificationCenter defaultCenter] 
      postNotificationName:kTLFetchedActiveUserNotification object:nil];


    } 
    failure:^(__unused AFHTTPRequestOperation *operation, NSError *error) {
      NSLog(@"Failure.");
      fetchModeActive = FALSE;
      [[NSNotificationCenter defaultCenter] 
        postNotificationName:kTLFetchedActiveUserNotification object:error];
    }];


    while(self.fetchModeActive) {
        // WHY DOES THIS RUN INFINITELY?
        // Both above Success: & Failure: blocks set fetchModeActive = FALSE 
        // when complete
        NSLog(@"fetching....");
    }

}

一番下までスクロールすると、待機中のループが表示されます。これが無限に「フェッチ中...」を出力しているのはなぜですか?? success:failure:の両方のブロックが fetchModeActive フラグを false に戻しますか?

私の理解では、このフェッチ操作はバックグラウンドで非同期に実行されますが、フェッチは実行されていないようです!

助言がありますか?別のスレッドでフェッチ リクエストを起動する必要がありますか?

ありがとう!

4

1 に答える 1

1

あなたの質問に答えるために、これが終了しない理由は、ブロックがブロックのスコープ外で変数を変更できるようにするために、__block前にディレクティブが必要だからです。fetchModeActive(Objective-Cの規則であるため、ブールリテラルとしても使用することをお勧めしYESますNO

しかし、より大きなポイントに対処するために、このようにすべきではありません。代わりに、操作を作成し、-startそれを(またはさらに良い方法で)に追加しNSOperationQueueます。すべてがバックグラウンドで非同期に実行され、終了時にコールバックをトリガーします。

非同期プログラミングは、頭を動かすのが難しい場合があります。このメソッドの終了に依存する動作を定義する必要がある場合は、メソッドにブロックパラメーターを追加し、成功および失敗のコールバックでそれを実行することをお勧めします。

于 2012-04-19T19:16:04.973 に答える