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 网络方法中的相关代码)。