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