ios - SVProgressHUD 的性能问题

标签 ios svprogresshud

我有一段代码产生了倾倒性能,但没有按预期工作。它利用来自以下 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 在此挂起时间内显示,我该怎么做?

最佳答案

您可以尝试像这样执行 hte 请求并在 block 内处理其余部分。 block 内的代码只有在请求返回时才会运行。

所以它可能是这样的:

[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];
}  

}];

关于ios - SVProgressHUD 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19662847/

相关文章:

ios - SVProgressHUD 1.0 不调光和错误的样式

ios - 在 viewDidLoad 中执行对服务器的调用

ios - 在 UIWebView 加载时显示 SVProgressHUD

ios - 使用点击手势关闭 SVProgressHUD

ios - 如何从JSON更新TableView

ios - captureStillImageAsynchronously 在特定时间不起作用

ios - 如何将数据从网页传递到 iPhone 应用程序

ios - 使用 setContainerView 时不显示 SVProgressHUD

ios - 圆定位逻辑内的中心文本

iphone - 模态视图 Controller 如何与堆栈一起工作?