zon*_*gon 1 grand-central-dispatch ios svprogresshud
我想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];
});
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
}
- (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;
}
Run Code Online (Sandbox Code Playgroud)
您必须发送[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];
})
});
Run Code Online (Sandbox Code Playgroud)
只能在主线程上修改所有用户界面元素.
注:请注意,dispatch_async()返回(几乎)立即,这样result是不设置时dispatch_async()的回报.并且不要试图使用信号量等待块完成.这在后台线程上很好,但很可能会在主线程上造成死锁.
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |