Objective c 使用RefreshControl异步刷新

Objective c 使用RefreshControl异步刷新,objective-c,uitableview,ios7,asynchronous,uirefreshcontrol,Objective C,Uitableview,Ios7,Asynchronous,Uirefreshcontrol,我正在使用AFNetworking从API加载数据,以刷新UITableView。我希望刷新控制器能够反映这一点 用户下拉并显示刷新控制盘 API调用退出(异步调用) API调用返回成功或错误 UITableViewController完成刷新,重新加载数据,刷新控制盘消失 因此,我在自定义UIViewController的viewDidLoad中添加了一个刷新控件(我的表视图是此主视图的子视图),如下所示: //Set up refresh controller tableContro

我正在使用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)asyncDone(id)responseObject{
        tableData = responseObject;
        NSLog(@"Yay, I'm done!");
    }
    
    不幸的是,刷新控件当然是在异步调用发送的那一刻完成的,而不是在它完成时完成的,这样我就没有更新的数据了。在异步调用实际完成之前,我如何让它挂起一段时间?

    您需要调用,以及异步调用何时开始和结束。要做到这一点,还需要存储对
    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
    调用分派到主线程:


    当我想手动触发刷新时,这可以正常工作,但是当它们下拉时呢?它会自动启动begin刷新,调用我的loadSubscriptions方法,然后在完成后调用EndRefresh,对吗?我必须对其进行测试以确定,但我认为手动拉取不会单独触发
    beginRefreshing
    ;我想您还是需要手动调用它。文档状态:控件不直接启动刷新操作。相反,它在应该发生刷新操作时发送UIControlEventValueChanged事件。必须为此事件分配操作方法,并使用它执行所需的任何操作。我知道这直接涉及到刷新表视图数据所需的任何操作,但我认为这也意味着您仍然需要调用
    begin/endRefreshing
    。看起来您是正确的。AFNetworking在预打包的主线程上处理完成调用,所以我不必担心这一点。谢谢你的教育。
    -(void)loadSubscriptions{
        [self.refreshControl beginRefreshing];
    
        updated = YES;
        [connections asyncCall:self]; 
    }
    
    -(void)asyncDone(id)responseObject{
        tableData = responseObject;
        NSLog(@"Yay, I'm done!");
    
        [self.refreshControl endRefreshing];
    }
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.refreshControl endRefreshing];
    });