我正在使用AFNetworking从API执行一些数据加载以刷新UITableView。我希望刷新控制器能够反映出这一点。
用户拉下并出现刷新轮
API调用结束(异步调用)
API调用返回成功或错误
UITableViewController完成刷新,重新加载数据,刷新轮消失
所以我在自定义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!");
}
不幸的是,刷新控制当然是在异步调用发送的那一刻完成,而不是在完成时,完全没有更新的数据。在真正完成异步调用之前,我该怎样才能暂停一下?
答案 0 :(得分:1)
当您的异步通话开始和结束时,您需要致电beginRefreshing
和endRefreshing
。您还需要存储对refresh
控件的引用来执行此操作。
所以,在loadSubscriptions
和asyncDone:
:
-(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];
});