1

我正在开发一个 IOS 5 应用程序,它从 url 获取提要并在 tableview 中显示帖子。我有一个视图控制器,可以加载带有提要中帖子的表格单元格。这一切都完美无缺。

但是,我想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方法中显示。

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

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

4

1 回答 1

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(显示进度界面)。

于 2012-09-07T09:54:23.833 回答