原理:
RunLoop在循环过程中监听着port事件和timer事件,
当前线程有任务时,唤醒当当线程去执行任务,
任务执行完成以后,使当前线程进入休眠状态。
代码:.h
//
// LWQ_RunloopTableView.h
// BathoathProject
//
// Created by 葫芦娃 on 2021/6/17.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^LoadOtherBlock)(id arguments);
@interface LWQ_RunloopTableView : UIViewController
//task模式优化列表
@property(nonatomic, strong) NSMutableArray *taskArray;
@property(nonatomic, assign) NSInteger maxTaskNumber;
@property(nonatomic, strong) NSTimer *timer;
@property(nonatomic, strong) UITableView *tableView;
@property(nonatomic, copy)LoadOtherBlock mainBlock;
- (void)addTask;
@end
NS_ASSUME_NONNULL_END
.m
//
// LWQ_RunloopTableView.m
// BathoathProject
//
// Created by 葫芦娃 on 2021/6/17.
//
#import "LWQ_RunloopTableView.h"
@interface LWQ_RunloopTableView ()<UITableViewDelegate,UITableViewDataSource>
@end
@implementation LWQ_RunloopTableView
- (void)viewDidLoad {
[super viewDidLoad];
//最大任务数
self.maxTaskNumber=10;
self.taskArray=[NSMutableArray new];
//定时器不断循环task
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"timer");
void(^task)() = [self.taskArray firstObject];
if (task) {
task();
}
[self.taskArray removeObject:task];
}];
}
//RuntLoop列表优化
- (UITableView *)tableView{
if (!_tableView) {
_tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, KscreenWidth, KscreenHeight) style:UITableViewStylePlain];
_tableView.delegate=self;
_tableView.dataSource=self;
_tableView.backgroundColor=[UIColor whiteColor];
_tableView.estimatedRowHeight=100;
}
return _tableView;
}
- (void)addTask{
void(^task)(void) =^{
self.mainBlock(@"");
};
//添加任务
[self.taskArray addObject:task];
//超过任务数则删除任务
if (self.taskArray.count == self.maxTaskNumber) {
[self.taskArray removeObjectAtIndex:0];
}
}
@end
//使用
继承于LWQ_RunloopTableView创建controller
在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
里调用[self addTask];
调用Block
self.mainBlock = ^(id _Nonnull arguments) {
//你自己的cell赋值等处理
};
//例如
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
LWQ_TableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"LWQ_TableViewCell" forIndexPath:indexPath];
if (!cell) {
cell=[[LWQ_TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"LWQ_TableViewCell"];
}
[self addTask];
self.mainBlock = ^(id _Nonnull arguments) {
//你自己的代码
cell.mainImageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"name" ofType:@"gif"]];
};
return cell;
}