我想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]; });
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;
}
- (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()
的回报.并且不要试图使用信号量等待块完成.这在后台线程上很好,但很可能会在主线程上造成死锁.
您必须发送[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()
的回报.并且不要试图使用信号量等待块完成.这在后台线程上很好,但很可能会在主线程上造成死锁.