2014-08-28 62 views
0

我正在使用AFNetworking从API执行一些数据加载以刷新UITableView。我希望刷新控制器能够如此反映。使用RefreshControl异步刷新

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

  2. API调用熄灭(异步调用)

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

  4. 的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!"); 
} 

不幸的是,刷新控制完成,当然,异步调用发送的分钟,而不是完成时,没有更新的数据。在异步调用实际完成之前,我怎样才能让这件事情挂出来?

回答

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]; 
}); 
+0

这将正常工作时,我想手动触发刷新,但是,当他们拉下来?这会自动启动开始刷新,调用我的loadSubscriptions方法,然后在完成时调用endRefreshing,是否正确? – steventnorris 2014-08-28 20:34:03

+0

我不得不测试它是肯定的,但我不认为手动拉自己触发'beginRefreshing';我认为你仍然需要手动调用它。 – 2014-08-28 20:36:15

+0

文档状态:_控件不直接启动刷新操作。相反,当发生刷新操作时,它会发送UIControlEventValueChanged事件。您必须为此事件分配一个操作方法,并使用它来执行所需的任何操作._我知道这是直接讨论您需要执行的操作来刷新表视图的数据,但我认为这也意味着您仍然需要调用'begin/endRefreshing'。 – 2014-08-28 20:42:56