我正在开发一个需要登录表单的项目,使用webservice进行身份验证。我没有连接到服务器的问题,但似乎NSURLSession阻止了我的用户界面,我真的不知道为什么经过大量的调试。
为简单起见,这是我的代码:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"example.com/service"]];
//1
//_sessionLogin = [NSURLSession sessionWithConfiguration:sessionConfigurationLogin delegate:self delegateQueue:nil];
//2 //Whether I use 1 or 2, it acts the same way
_sessionLogin = [NSURLSession sharedSession];
NSURLSessionDataTask *sessionDataTaskLogin = [_sessionLogin dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if(!error)
{
NSLog(@"loginWithSuccess");
UIAlertView *alertError = [[UIAlertView alloc] initWithTitle:@"Login ok" message:@"ok" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil];
[alertError show];
}
}];
//Begin login request
[sessionDataTaskLogin resume];
_sessionLogin是一个NSURLSession
由于与我的服务器的连接很快,NSLog(@“loginWithSuccess”)几乎在我按下登录按钮后出现,但是我需要一段时间(很长一段时间),UIAlertView大约需要10秒钟显示。我也无法与用户界面互动。
提前感谢您的每一个解决方案。
答案 0 :(得分:10)
您的完成块未在主线程上运行。由于UI更新必须在主线程上进行,因此您应该将警报视图分派给主队列,您将立即看到它。
NSURLSessionDataTask *sessionDataTaskLogin = [_sessionLogin dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSLog(@"loginWithSuccess");
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertError = [[UIAlertView alloc] initWithTitle:@"Login ok" message:@"ok" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil];
[alertError show];
});
}
}];