[tableView reloadData] 和 runloop,tableviewreloaddata

來源:互聯網
上載者:User

[tableView reloadData] 和 runloop,tableviewreloaddata

需要[tableView reloadData]後需要立即擷取tableview的cell、高度,或者需要滾動tableview,那麼,直接在reloadData後執行代碼是會有問題的。

斷點調試感覺[tableview reloaddata]是個非同步作業導致下面的代碼並不會再它執行完後才執行。

於是就想到了多線程,最簡單使用動畫來順延強制

[UIView animateWithDuration:0.3 animations:^{            [self.collectionView reloadData];        } completion:^(BOOL finished) {            [self.collectionView setContentOffset:offset animated:NO];        }];

解決是解決了,但是感覺有特別明顯的動畫效果還是去查了資料才知道是runloop的原因而不是非同步問題

大神解說是因為[tableview reloaddata] 需要在當前方法在runloop中執行完後它再在runloop中執行,處理函數是在runloop中串列的排隊執行的。但是[tableview reloaddata]後面的代碼需要[tableview reloaddata]的計算結果,所以[tableview reloaddata]後面的代碼需要一個順延強制。只有當前方法不再佔用runloop,[tableview reloaddata]才可以在runloop中執行,而這時順延強制的部分在runloop中早就排在了[tableview reloaddata]的前面執行完了。如果表中的資料非常大,在一個runloop周期沒執行完,這時,需要tableview視圖資料的操作就會出問題了。apple並沒有直接提供reloadData的api,想要程式延遲到reloadData結束再操作,可以用以下方法

方法1:layoutIfNeeded會強制重繪並等待完成

[self.tableView reloadData];  [self.tableView layoutIfNeeded];  //重新整理完成  

方法2:

reloadData會在主隊列執行,而dispatch_get_main_queue會等待機會,直到主隊列空閑才執行。

[self.collectionView reloadData];dispatch_async(dispatch_get_main_queue(), ^{    // 重新整理完成    [self.collectionView setContentOffset:offset animated:NO];    });}

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.