首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SVProgressHUD的性能问题

SVProgressHUD的性能问题
EN

Stack Overflow用户
提问于 2013-10-29 15:40:57
回答 2查看 1.2K关注 0票数 0

我有一段代码正在产生倾注性能,而不是预期的工作。它利用来自SVProgressHUD的https://github.com/samvermette/SVProgressHUD存储库中的github。我有一个需要使用[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]的代码区域。我希望在同步请求之前显示一个进度hud,然后在请求完成后退出。下面是所讨论的代码:

代码语言:javascript
复制
//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;
}  

由于某些原因,同步请求阻止显示集线器。它在同步请求发生后立即显示,不幸的是,这也是当它被拒绝的时候。向用户显示的行为是,应用程序挂起,等待同步请求完成,快速闪烁集线器,然后再次响应。我怎样才能解决这个问题?我想要在这个挂起时间显示SVProgressHUB,我怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-29 15:52:09

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

所以可能是这样的:

代码语言:javascript
复制
[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];
}  

}];
票数 2
EN

Stack Overflow用户

发布于 2013-10-29 15:44:30

是的,这是完全有意义的,因为HUD显示在主线程中,所有UI动画都是。然后启动正在阻塞主线程的请求。

您必须在后台执行请求,这对所有网络请求都有意义,或者延迟阻塞调用以给您的UI更新时间。

我真的建议您使用异步请求,因为这将使应用程序具有更强的响应性,即使您的应用程序需要等待请求完成才能完成任何其他操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19662847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档