0

for () ループ内で、いくつかの JSON オブジェクトを解析しながら、アプリで一種の UIActivityIndi​​catorView を表示します。[UIActivityIndi​​catorView startAnimating] と [UIActivityIndi​​catorView stopAnimating] を配置して、解析の実際の END を表示する必要がある場所がわかりません (完全な for () ループの最後に)。これは単純化されたコードです:

- (void)parseMethod {

// other stuff

        for (int i=0; i < [arrayJSON count]; i++) {

            NSURL *url = [NSURL URLWithString:
                          [NSString stringWithFormat:
                           @"http://WWW.REMOTESERVERWITHJSONSOURCE.NET/%@",[arrayJSON objectAtIndex:i]]];

            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

                NSMutableDictionary *arrayMain = [JSON objectForKey:@"main"];
                NSMutableDictionary *arrayMain2 = [JSON objectForKey:@"main2"];
                [arrayA1 addObject:[arrayMain valueForKey:@"A1"]];
                [arrayA2 addObject:[arrayWind valueForKey:@"A2"]];

                // HERE FINISH PARSING AFJSONREQUESTOPERATION
                // IF I PUT HERE [UIActivityIndicatorView stopAnimating] IT SHOWS AT THE END OF FIRST for () LOOP

                [table reloadData];
                [table scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]
            }
                                                                            failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                                                            NSLog(@"%@", [error userInfo]);
                                                                        }];
            [operation start];
            // HERE START PARSING AFJSONREQUESTOPERATION
            [UIActivityIndicatorView startAnimating] 
        }

    // HERE FINISH THE for () LOOP ??
    // IF I PUT HERE [UIActivityIndicatorView stopAnimating] IT SHOWS AGAIN AT THE END OF FIRST for () LOOP

} 

    // HERE FINISH THE parseMethod ??
    // IF I PUT HERE [UIActivityIndicatorView stopAnimating] IT SHOWS AGAIN AT THE END OF FIRST for () LOOP

    }

ご覧のとおり、[UIActivityIndi​​catorView stopAnimating] を配置する本当の場所を見つけることができません。最初の解析 (最初の for () ループ) の最後でどこでも停止します: したがって、完了を待つ方法があります。 for () ループで [UIActivityIndi​​catorView stopAnimating] (または別のメソッド) を呼び出します。ありがとう!

ALTERNATIVE 解析が速すぎて、UIActivityIndi​​catorView の表示と読み込みが見えないのではないでしょうか? この場合、一種のタイマー (またはスリープ (unsigned int)) を配置して、消える前に数秒待つ必要がありますか?

4

3 に答える 3

2

あなたの問題は、ループで行っているリクエストが非同期であるため、ループが完了するまでループがハングアップせず、それぞれがすばやく連続して起動され、配列をロードするためのコードブロックが実行されることです.データが受信されます。

ブロックが終了するたびにインクリメントされるブロックでカウンターを使用でき、カウンターが一致する[arrayJSON count]と、アニメーションをいつ停止するかがわかります。__blockストレージを使用することを忘れないでください

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html

于 2013-01-30T11:27:45.123 に答える
1

解決策は

  1. そこで何が行われているかが明確になるようにコードを単純化します (事前にブロックを宣言します)。

  2. 実行中のリクエストの数をカウントし、すべてのリクエストが完了した場合にのみグローバル アクションを実行します。

typedef void (^AFJSONSuccessBlock) (NSURLRequest *request, NSHTTPURLResponse *response, id JSON);
typedef void (^AFJSONFailureBlock) (NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON);
[UIActivityIndicatorView startAnimating];

__block int numRequests = [arrayJSON count];

AFJSONSuccessBlock onSuccess = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {   
    [...]

    numRequests--;

    if (numRequests == 0) {
        [UIActivityIndicatorView stopAnimating];
    }
};

AFJSONFailureBlock onFailure = ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    [...]

    numRequests--;

    if (numRequests == 0) {
        [UIActivityIndicatorView stopAnimating];
    }
};

for (NSString* jsonPath in arrayJSON) {
    NSString* absolutePath = [NSString stringWithFormat:@"http://WWW.REMOTESERVERWITHJSONSOURCE.NET/%@", jsonPath];
    NSURL *url = [NSURL URLWithString:absolutePath];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation *operation;
    operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                                success:onSuccess
                                                                failure:onFailure];
    [operation start];
}
于 2013-01-30T11:26:30.533 に答える
0

コード内でループが終了する場所を特定できない場合は、コードが複雑になっていることを示していると一般的に言えます。for ループは、else ステートメントの直前で終了すると思います。確認するには、開始ブラケットをクリックするだけで、XCode (使用している場合) がコードブロックを強調表示します...

于 2013-01-30T11:13:34.957 に答える