0

注ぐパフォーマンスを生成し、期待どおりに動作しないコードのセクションがあります。https://github.com/samvermette/SVProgressHUDにある次の github リポジトリから SVProgressHUD を利用します。を使用する必要があるコード領域があります[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]。同期リクエストの前に進行状況を表示し、リクエストが終了した後に閉じたいと思います。問題のコードは次のとおりです。

//Display the progress HUB
[SVProgressHUD showWithStatus:@"Signing Up..." maskType:SVProgressHUDMaskTypeClear];

NSError* error;
NSURLResponse *response = nil;
[self setUserCredentials];

// create json object for a users session
NSDictionary* session = [NSDictionary dictionaryWithObjectsAndKeys:
                         firstName, @"first_name",
                         lastName, @"last_name",
                         email, @"email",
                         password, @"password",
                         nil];

NSData *jsonSession = [NSJSONSerialization dataWithJSONObject:session options:NSJSONWritingPrettyPrinted error:&error];

NSString *url = [NSString stringWithFormat:@"%@api/v1/users.json", CoffeeURL];

NSURL *URL = [NSURL URLWithString:url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:30.0];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonSession length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:jsonSession];

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *JSONResponse = [NSJSONSerialization JSONObjectWithData:[dataString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&error];

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSInteger statusCode = httpResponse.statusCode;

NSLog(@"Status: %d", statusCode);

if (JSONResponse != nil && statusCode == 200)
{
    //Dismiss progress HUB here
    [SVProgressHUD dismiss];
    return YES;
}
else
{
    [SVProgressHUD dismiss];
    return NO;
}  

何らかの理由で、同期要求が HUB の表示をブロックします。同期リクエストが発生した直後に表示されますが、残念ながら、これは閉じられたときでもあります。ユーザーに表示される動作は、アプリがハングし、同期要求が完了するのを待ち、HUB をすばやくフラッシュしてから、再び応答するようになるというものです。この問題を解決するにはどうすればよいですか? このハング タイム中に を表示したいのですがSVProgressHUB、どうすればよいですか?

4

2 に答える 2

2

このようなリクエストを実行してみて、ブロック内から残りを処理することができます。ブロック内のコードは、リクエストが返されたときにのみ実行されます。

したがって、次のようになります。

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *JSONResponse = [NSJSONSerialization JSONObjectWithData:[dataString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&error];

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSInteger statusCode = httpResponse.statusCode;

NSLog(@"Status: %d", statusCode);

if (JSONResponse != nil && statusCode == 200)
{
    //Dismiss progress HUB here
    [SVProgressHUD dismiss];    
}
else
{
    [SVProgressHUD dismiss];
}  

}];
于 2013-10-29T15:52:09.540 に答える
1

はい、これは完全に理にかなっています。HUD はメイン スレッドに表示されているため、すべての UI アニメーションが表示されます。次に、メインスレッドをブロックしているリクエストを開始します。

リクエストをバックグラウンドで実行する必要があります。これは、すべてのネットワーク リクエストにとって意味があります。または、ブロッキング呼び出しを遅らせて、UI を更新する時間を与える必要があります。

非同期リクエストを使用することを強くお勧めします。これにより、他の操作を行う前にリクエストが完了するまでアプリが待機する必要がある場合でも、アプリの応答性が向上します。

于 2013-10-29T15:44:30.940 に答える