GCD和progressHUD

时间:2014-08-17 20:53:35

标签: ios objective-c ios7 grand-central-dispatch uiprogressview

使用任何形式的progressHUD(SV,MB等)我遇到这个问题,HUD在显示后立即隐藏或永久停留在那里。在下面的示例中,无论Twitter提要(或其他视图控制器的页面)是否已完成加载,HUD都会永久保留。如何在单独线程中的任务完成后使HUD消失?

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

       //Sets the auth key (user or app) for the RMACC Twitter Feed
       STTwitterAPI *twitter = [STTwitterAPI twitterAPIOSWithFirstAccount];

       [twitter verifyCredentialsWithSuccessBlock:^(NSString *username) {

           [twitter getUserTimelineWithScreenName:@"RMACCNewsNotes" count:10 successBlock:^(NSArray *statuses) {

               dispatch_async(dispatch_get_main_queue(), ^{
                   [MBProgressHUD hideHUDForView:self.view animated:YES];
               });

               self.twitterFeed =[NSMutableArray arrayWithArray:statuses];

               [self.tableView reloadData];

            } errorBlock:^(NSError *error){ }];

        } errorBlock:^(NSError *error) {
            [self twitterselfauthrequest];
        }];

    });        
}

3 个答案:

答案 0 :(得分:1)

  1. 块中的安全捕获self:在第一个块中使用:__weak typeof (self) weakSelf = self;

  2. 您正在呼叫[self.tableView reloadData];而不是主线程;

  3. 此请求:getUserTimelineWithScreenName可能会在错误中完成:在这种情况下,您没有登录,因此请确保它已成功完成。

答案 1 :(得分:1)

它应该是这样的:

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

// do all your twitter stuff, including the error checking

      dispatch_async(dispatch_get_main_queue(), ^{
         [self.tableView reloadData];
         [MBProgressHUD hideHUDForView:self.view animated:YES];
      });
});

答案 2 :(得分:0)

我发现了两件可能有问题的事情:

  1. 你确定这条线是在主线程中启动的吗?

    [MBProgressHUD showHUDAddedTo:self.view animated:YES];

  2. 你确定这条线路一直在推出吗?

    [MBProgressHUD hideHUDForView:self.view animated:YES];