使用RefreshControl异步刷新

时间:2014-08-28 20:21:00

标签: objective-c uitableview ios7 asynchronous uirefreshcontrol

我正在使用AFNetworking从API执行一些数据加载以刷新UITableView。我希望刷新控制器能够反映出这一点。

  1. 用户拉下并出现刷新轮

  2. API调用结束(异步调用)

  3. API调用返回成功或错误

  4. UITableViewController完成刷新,重新加载数据,刷新轮消失

  5. 所以我在自定义UIViewController的viewDidLoad中添加了一个刷新控件(我的表视图是这个主视图的子视图),如下所示:

    //Set up refresh controller
        tableController = [[UITableViewController alloc]init];
        tableController.view = self.subscriptionsTable;
        UIRefreshControl* refresh = [[UIRefreshControl alloc]init];
        [refresh addTarget:self action:@selector(loadSubscriptions) forControlEvents:UIControlEventAllEvents];
        tableController.refreshControl = refresh;
    

    然后我有了我的刷新方法:(所有[connections asyncCall:self]都会通过AFNetworking pod向API发送异步调用,完成时调用我的视图控制器的完整方法)

    -(void)loadSubscriptions{
        updated = YES;
        [connections asyncCall:self];
    }
    

    视图控制器已完成的方法如下所示

    -(void)asyncDone(id)responseObject{
        tableData = responseObject;
        NSLog(@"Yay, I'm done!");
    }
    

    不幸的是,刷新控制当然是在异步调用发送的那一刻完成,而不是在完成时,完全没有更新的数据。在真正完成异步调用之前,我该怎样才能暂停一下?

1 个答案:

答案 0 :(得分:1)

当您的异步通话开始和结束时,您需要致电beginRefreshingendRefreshing。您还需要存储对refresh控件的引用来执行此操作。

所以,在loadSubscriptionsasyncDone:

-(void)loadSubscriptions{
    [self.refreshControl beginRefreshing];

    updated = YES;
    [connections asyncCall:self]; 
}

-(void)asyncDone(id)responseObject{
    tableData = responseObject;
    NSLog(@"Yay, I'm done!");

    [self.refreshControl endRefreshing];
}

注意:许多异步方法会在后台线程上调用它们的完成块,因此您可能需要将endRefreshing调用发送到主线程:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.refreshControl endRefreshing];
});