SVProgressHud等待太长时间才能解雇

 mobiledu2502927333 发布于 2023-02-04 13:57

我想SVProgressHUD在登录过程中显示.但是SVProgressHUD登录后仍然等待.它~15seconds在"登录成功"消息后被解雇.这是我的代码:

[SVProgressHUD show];

__block BOOL result;
dispatch_async(queue, ^{

    result = [self autanticate];
    NSLog(@"autantication result = %d", result);
    result = [self getCSRFToken];
    NSLog(@"Login success result = %d", result);

    [SVProgressHUD dismiss];
});

autanticategetCSRFToken功能如下:

- (BOOL) getCSRFToken
{
__block BOOL success = false;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// Make sure that the callbacks are not called from the main queue, otherwise we would deadlock

manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer  serializer];

NSDictionary *parameters = @{@"username": self.username.text,
                             @"password": self.password.text};

NSLog(@"Creating CSRF semaphore");
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

// CSRF Token bilgisini alal?m
NSString *Url = [NSString stringWithFormat:@"%@%@", BaseURLString, @"?q=services/session/token"];
[manager GET:Url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"CSRF Token: %@", responseObject);
    success = true;
    dispatch_semaphore_signal(semaphore);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
    success = false;
    dispatch_semaphore_signal(semaphore);

}];
NSLog(@"Waiting CSRF semaphore");
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

return success;

}

- (BOOL)autanticate
{
__block BOOL isAutanticated = false; 
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer  serializer];

NSDictionary *parameters = @{@"username": self.username.text,
                             @"password": self.password.text};

// Session bilgilerini alal?m

NSLog(@"Creating autantication semaphore");
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

NSString *Url = [NSString stringWithFormat:@"%@%@", BaseURLString, @"?q=rest/mserv/signin"];
[manager POST:Url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"JSON: %@", responseObject);

    NSDictionary *result = [responseObject objectForKey:@"result"];
    NSString *sessid = [result objectForKey:@"sessid"];
    NSString *session_name = [result objectForKey:@"session_name"];
    NSLog(@"sessid = %@\nsession_name=%@", sessid, session_name);
    isAutanticated = true;
    dispatch_semaphore_signal(semaphore);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
    isAutanticated = false;
    dispatch_semaphore_signal(semaphore);

}];

NSLog(@"Waiting autanticatio semaphore");
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

return isAutanticated;

}

Martin R.. 9

您必须发送[SVProgressHUD dismiss]到主线程

[SVProgressHUD show];
__block BOOL result;
dispatch_async(queue, ^{
    result = [self autanticate];
    NSLog(@"autantication result = %d", result);
    result = [self getCSRFToken];
    NSLog(@"Login success result = %d", result);
    dispatch_async(dispatch_get_main_queue(), ^{
        [SVProgressHUD dismiss];
    })
});

只能在主线程上修改所有用户界面元素.

注:请注意,dispatch_async()返回(几乎)立即,这样result设置时dispatch_async()的回报.并且不要试图使用信号量等待块完成.这在后台线程上很好,但很可能会在主线程上造成死锁.

1 个回答
  • 您必须发送[SVProgressHUD dismiss]到主线程

    [SVProgressHUD show];
    __block BOOL result;
    dispatch_async(queue, ^{
        result = [self autanticate];
        NSLog(@"autantication result = %d", result);
        result = [self getCSRFToken];
        NSLog(@"Login success result = %d", result);
        dispatch_async(dispatch_get_main_queue(), ^{
            [SVProgressHUD dismiss];
        })
    });
    

    只能在主线程上修改所有用户界面元素.

    注:请注意,dispatch_async()返回(几乎)立即,这样result设置时dispatch_async()的回报.并且不要试图使用信号量等待块完成.这在后台线程上很好,但很可能会在主线程上造成死锁.

    2023-02-04 13:59 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有