使用RefreshControl异步刷新
问题描述:
我正在使用AFNetworking从API执行一些数据加载以刷新UITableView。我希望刷新控制器能够如此反映。使用RefreshControl异步刷新
用户拉下,并刷新轮出现
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荚的API,在调用我的视图控制器的完成方法完成时)
-(void)loadSubscriptions{
updated = YES;
[connections asyncCall:self];
}
视图控制器完成的方法是这样的
-(void)asyncDone(id)responseObject{
tableData = responseObject;
NSLog(@"Yay, I'm done!");
}
不幸的是,刷新控制完成,当然,异步调用发送的分钟,而不是完成时,没有更新的数据。在异步调用实际完成之前,我怎样才能让这件事情挂出来?
答
当您的异步呼叫开始和结束时,您需要拨打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];
});
这将正常工作时,我想手动触发刷新,但是,当他们拉下来?这会自动启动开始刷新,调用我的loadSubscriptions方法,然后在完成时调用endRefreshing,是否正确? – steventnorris 2014-08-28 20:34:03
我不得不测试它是肯定的,但我不认为手动拉自己触发'beginRefreshing';我认为你仍然需要手动调用它。 – 2014-08-28 20:36:15
文档状态:_控件不直接启动刷新操作。相反,当发生刷新操作时,它会发送UIControlEventValueChanged事件。您必须为此事件分配一个操作方法,并使用它来执行所需的任何操作._我知道这是直接讨论您需要执行的操作来刷新表视图的数据,但我认为这也意味着您仍然需要调用'begin/endRefreshing'。 – 2014-08-28 20:42:56