1.runloop在執(zhí)行任務時循環(huán)速度很快狂魔,一秒鐘要循環(huán)多次蒜埋,當發(fā)現(xiàn)沒有內(nèi)核mach_msg事件后,進入睡眠最楷,每隔一分鐘循環(huán)一次整份。
![](https://ww1.sinaimg.cn/large/006tNc79gy1fci3k9vqbqj30ke07ntbe.jpg)
2.監(jiān)聽reloadData完成
先來看看執(zhí)行reloadData都發(fā)生了什么。
reloadData是一個異步方法籽孙,更具體點來說烈评,是reloadData這個調(diào)用中包含了異步操作。
當我們reloadData的時候蚯撩,我們本意是刷新UITableView础倍,隨后會進入一系列UITableViewDataSource和UITableViewDelegate的回調(diào),其中有些是和reloadData同步發(fā)生的胎挎,有些則是異步發(fā)生的沟启。
- 同步:
tableView:numberOfRowsInSection:
- 異步:
tableView:cellForRowAtIndexPath:
-
tableView:heightForRowAtIndexPath:
這個方法有些特殊,在同步和異步的時候都進行了回調(diào)犹菇。
一次runloop有兩個機會執(zhí)行GCD dispatch main queue中的任務德迹,分別在休眠前和被喚醒后。設置tableView layoutIfNeeded為YES揭芍,在即將進入休眠時執(zhí)行異步任務胳搞,重繪一次界面。
![](https://ww3.sinaimg.cn/large/006tNc79gy1fci5ee85duj313g0ah14x.jpg)
所以監(jiān)聽reloadData完成可以有兩種方法
方法一:喚醒時刻當作reloadData完成
dispatch_async(dispatch_get_main_queue(), ^{
_isReloadDone = NO;
[tableView reload]; //會自動設置tableView layoutIfNeeded為YES,意味著將會在runloop結束時重繪table
dispatch_async(dispatch_get_main_queue(),^{
_isReloadDone = YES;
});
});
方法二:自定義UITableView肌毅,layoutSubviews之后當作reloadData完成(復雜筷转,但可以更好的理解方法一)
#import "DBTableView.h"
@interface DBTableView()
@property (nonatomic, copy) void (^reloadDataCompletionBlock)();
@end
@implementation DBTableView
- (void)reloadDataWithCompletion:(void (^)())completionBlock {
self.reloadDataCompletionBlock = completionBlock;
[super reloadData];
}
- (void)layoutSubviews {
[super layoutSubviews];
if (self.reloadDataCompletionBlock) {
self.reloadDataCompletionBlock();
self.reloadDataCompletionBlock = nil;
}
}
@end
調(diào)用的時候
[self.tableView reloadDataWithCompletion:^{
NSLog(@"完成刷新");
}];
在主線程中執(zhí)行dispatch_async(dispatch_get_main_queue()
做了什么?
通常我們在子線程任務結束后使用dispatch_async(dispatch_get_main_queue()
來回到主線程刷新UI,那么在主線程使用它是為了什么呢悬而?
情景:在快速滑動的時候reload
dispatch_async(dispatch_get_main_queue(), ^{
[tableView reloadData];
});
加入主隊列后呜舒,會在合適的一次loop循環(huán)中進行reload操作,并且在這次loop中渲染cell笨奠,實現(xiàn)流暢的滑動袭蝗。
而沒有加入主隊列的reload,渲染cell的時機不固定般婆。一般發(fā)生跳屏到腥、白屏,就是因為需要等到tableView停下才會繼續(xù)渲染cell蔚袍。
參考鏈接:
iOS 事件處理機制與圖像渲染過程