在单独的线程中加载Feed时,IOS 5显示SVProgressHUD不起作用

时间:2012-05-29 10:25:39

标签: iphone ios5

我正在开发一个IOS 5应用程序,该应用程序从网址获取提要并在tableview中显示帖子。我有一个View控制器,可以使用Feed中的帖子加载表格单元格。这一切都很完美。

但是,我希望在单独的帖子中加载Feed时使用SVProgressHUD来显示。

因此,在我的-(void)viewDidLoad方法中,我有以下内容:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [SVProgressHUD showInView:self.view status:@"loading.." networkIndicator:YES];
    dispatch_async(kBgQueue, ^{NSData* data = [NSData dataWithContentsOfURL: latestFeedURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];});

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(foregroundRefresh:) name:UIApplicationWillEnterForegroundNotification object:nil];

    self.pull = [[PullToRefreshView alloc] initWithScrollView:(UIScrollView *) self.feedTableView];
    [self.pull setDelegate:self];
    [self.feedTableView addSubview:self.pull];

    self.title = @"Latest";
}

- (void)fetchedData:(NSData *)responseData {
    //parse out the json data
    NSError* error;
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    NSMutableArray* latestFeed = [json objectForKey:@"posts"]; //2

    self.feedUpLoads = latestFeed; 
    NSLog(@"objects: %@", latestFeed); //3
    [self.feedTableView reloadData];
    [SVProgressHUD dismiss];
}

这一切都运行正常,即时获取在后台线程中加载的数据,我的表格显示的帖子包含所需的所有细节。我遇到的问题是SVProgressHUD根本没有显示。即使我将[SVProgressHUD showInView行放在fetchData方法中,它仍然没有显示。 (顺便说一下,我知道SVProgressHUD代码有效,因为我实际上可以在viewWillAppear方法中显示它。

我猜它没有用,因为在我调用它时,视图还没有完全存在?但是,如果是这样的情况我应该调用它以便在调用Feed时显示它,我应该在哪里删除它?

任何帮助表示赞赏!提前谢谢!!

1 个答案:

答案 0 :(得分:4)

对于遇到类似问题的其他人来说,这也可能发生,因为你有一个长循环或一段需要很长时间才能执行的代码。如果发生这种情况,您的进度条将不会显示,直到循环之后,这种方式会失败。

要解决此问题,您需要这样:

  • (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

基本上你的代码看起来像这样:

- (IBAction)submitPost:(id)sender {
    //now we show the loading bar and submit the comment
    [SVProgressHUD showWithStatus:@"Submitting post" maskType:SVProgressHUDMaskTypeGradient];
    SEL aSelector = @selector(submitDataOfPost);
    [self performSelectorInBackground:aSelector withObject:sender];
}

这基本上会加载进度条,在后台线程中,将调用您要执行的方法。这可以确保在执行代码的同时更新UI(显示进度hud)。