svprogresshud 没有在主线程上显示
svprogresshud not showing on main thread
在我的 tableviewcontroller 的 viewdidload 上,我有以下内容
[SVProgressHUD showWithStatus:@"Loading"];
[self getData];
[SVProgressHUD dismiss];
在 getData 方法中,我使用 AFNetworking 从我的后端获取数据 api。由于这是一个异步调用,我希望我的 SVProgressHUD 能够显示。
-(void) getData {
AFHTTPRequestOperationManager * reqManager =AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
//set auth token..etc
[reqManager GET:urlString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//code for success....
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//code for failure
}];
}
但它根本没有显示。所以很明显我正在处理我的主线程。我哪里错了?
问题是你在像
这样的方法调用后立即显示 HUD
[self getData];
[SVProgressHUD dismiss];
这就是问题所在。将解雇代码移至
-(void) getData {
AFHTTPRequestOperationManager * reqManager =AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
//set auth token..etc
[reqManager GET:urlString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//code for success....
[SVProgressHUD dismiss];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//code for failure
[SVProgressHUD dismiss];
}];
}
可以看到webservice调用成功和失败的dismiss
调用,通过
调用getData
方法
[SVProgressHUD showWithStatus:@"Loading"];
[self getData];
从这里删除 [SVProgressHUD dismiss]
。
问题不在于它没有在主线程上显示,而是它显示和消失的速度太快以至于您看不到它。这是因为 GET
是一个异步方法。
解决方案是采用完成处理程序模式,即当异步方法完成时 getData
将调用的代码块:
- (void)getDataWithCompletionHandler:(void (^)(NSError *))completionHandler {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//set auth token..etc
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//code for success....
if (completionHandler) {
completionHandler(nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//code for failure
if (completionHandler) {
completionHandler(error);
}
}];
}
和
[SVProgressHUD showWithStatus:@"Loading"];
[self getDataWithCompletionHandler:^(NSError *error) {
[SVProgressHUD dismiss];
}];
此模式允许您将 dismiss
的调用推迟到异步过程完成后,但它还将 SVProgressHUD
代码保持在一个区域中(而不是将其分散并掩埋) UI 网络方法中的相关代码)。
在我的 tableviewcontroller 的 viewdidload 上,我有以下内容
[SVProgressHUD showWithStatus:@"Loading"];
[self getData];
[SVProgressHUD dismiss];
在 getData 方法中,我使用 AFNetworking 从我的后端获取数据 api。由于这是一个异步调用,我希望我的 SVProgressHUD 能够显示。
-(void) getData {
AFHTTPRequestOperationManager * reqManager =AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
//set auth token..etc
[reqManager GET:urlString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//code for success....
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//code for failure
}];
}
但它根本没有显示。所以很明显我正在处理我的主线程。我哪里错了?
问题是你在像
这样的方法调用后立即显示 HUD[self getData];
[SVProgressHUD dismiss];
这就是问题所在。将解雇代码移至
-(void) getData {
AFHTTPRequestOperationManager * reqManager =AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
//set auth token..etc
[reqManager GET:urlString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//code for success....
[SVProgressHUD dismiss];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//code for failure
[SVProgressHUD dismiss];
}];
}
可以看到webservice调用成功和失败的dismiss
调用,通过
getData
方法
[SVProgressHUD showWithStatus:@"Loading"];
[self getData];
从这里删除 [SVProgressHUD dismiss]
。
问题不在于它没有在主线程上显示,而是它显示和消失的速度太快以至于您看不到它。这是因为 GET
是一个异步方法。
解决方案是采用完成处理程序模式,即当异步方法完成时 getData
将调用的代码块:
- (void)getDataWithCompletionHandler:(void (^)(NSError *))completionHandler {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//set auth token..etc
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//code for success....
if (completionHandler) {
completionHandler(nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//code for failure
if (completionHandler) {
completionHandler(error);
}
}];
}
和
[SVProgressHUD showWithStatus:@"Loading"];
[self getDataWithCompletionHandler:^(NSError *error) {
[SVProgressHUD dismiss];
}];
此模式允许您将 dismiss
的调用推迟到异步过程完成后,但它还将 SVProgressHUD
代码保持在一个区域中(而不是将其分散并掩埋) UI 网络方法中的相关代码)。