使用NSURLSession时UI被阻止

时间:2014-04-18 13:36:15

标签: objective-c ios7 nsurlsession

我正在开发一个需要登录表单的项目,使用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秒钟显示。我也无法与用户界面互动。

提前感谢您的每一个解决方案。

1 个答案:

答案 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];
        });
    }
}];