Ios SVProgressHud等待太长时间才解除

Ios SVProgressHud等待太长时间才解除,ios,grand-central-dispatch,svprogresshud,Ios,Grand Central Dispatch,Svprogresshud,我想在登录过程中显示SVProgressHUD。但是SVProgressHUD在登录后仍然等待。“登录成功”消息发出后约15秒,它将被解除。 这是我的密码: [SVProgressHUD show]; __block BOOL result; dispatch_async(queue, ^{ result = [self autanticate]; NSLog(@"autantication result = %d", result); result = [self

我想在登录过程中显示
SVProgressHUD
。但是
SVProgressHUD
在登录后仍然等待。“登录成功”消息发出后约15秒,它将被解除。 这是我的密码:

[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];
});
autanticate
getCSRFToken
函数如下所示:

- (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;
}


您必须将
[SVProgressHUD disclose]
分派到主线程

[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\u async()
返回 (几乎)立即,以便不设置
结果
dispatch\u async()返回时。
不要试图使用信号量来等待块完成。
这在后台线程上很好,但很可能会导致死锁

在主线程上。

您必须将
[SVProgressHUD dismise]
分派到主线程

[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\u async()
返回 (几乎)立即,以便不设置
结果
dispatch\u async()返回时。
不要试图使用信号量来等待块完成。
这在后台线程上很好,但很可能会导致死锁

在主线程上。

谢谢!它拯救了这一天!谢谢它拯救了这一天!