利用Runloop优化流畅度

时间:2021-02-22 21:11:07

利用Runloop优化流畅度

我们可以对runloop添加观察者,当观察到状态为kCFRunLoopExit,kCFRunLoopBeforeWaiting的时候,做一些耗时的处理,废话不说,直接上代码

- (void)viewDidLoad {
[super viewDidLoad];

self.view.backgroundColor = [UIColor redColor];

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:tableView];
tableView.delegate = self;
tableView.dataSource = self;

// for (int i = 0; i < 100000; i ++){
// UIView *view = [UIView new];
// [self.view addSubview:view];
// }

__block NSMutableArray *arr = [[NSMutableArray alloc] init];
for (int i = 0; i < 10000; i ++){
[arr addObject:@0];
}
NSLog(@"添加完了");
_arr = arr;

_observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);

if ((activity == kCFRunLoopExit || activity == kCFRunLoopBeforeWaiting ) && arr.count > 0){

UIView *view = [UIView new];
[self.view addSubview:view];
[arr removeObjectAtIndex:0];
NSLog(@"还有%ld",arr.count);


CFRunLoopWakeUp(CFRunLoopGetCurrent());
}

});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), _observer, kCFRunLoopDefaultMode);


CFRelease(_observer);
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 1000;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"123"];
if (!cell){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"123"];
}
cell.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0];

return cell;
}
- (void)dealloc {
CFRunLoopRemoveObserver(CFRunLoopGetCurrent(), _observer, kCFRunLoopCommonModes);
}

这里tableView滑动的时候是不会创建view的,只有滑动结束的时候才会继续创建,这主要用在不是很着急使用的场景对流畅度进行一定的优化