我有一段代码正在产生浇注性能并且无法按预期工作。 它利用来自以下 github 存储库的 SVProgressHUD,位于 https://github.com/samvermette/SVProgressHUD。 我有一个代码区域需要使用[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]
. 我想在同步请求之前显示进度 hud,然后在请求完成后关闭。 这是有问题的代码:
//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
,我该怎么做?
您可以尝试像这样执行请求,并从块内处理其余部分。块中的代码仅在请求返回时运行时运行。
所以它可能是这样的:
[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];
}
}];
是的,这是完全有意义的,因为 HUD 显示在主线程中,因此所有 UI 动画都是。然后你启动阻塞主线程的请求。
您必须在后台执行请求(这对所有网络请求都有意义),或者延迟阻止调用以使您的 UI 有时间更新。
我真的建议您使用异步请求,因为这将为您提供应用程序更具响应性,即使您的应用程序需要等待请求完成才能执行其他任何操作。