关于RunLoop Task模式实现列表优化

原理:

RunLoop在循环过程中监听着port事件和timer事件,
当前线程有任务时,唤醒当当线程去执行任务,
任务执行完成以后,使当前线程进入休眠状态。

代码:.h

//
//  LWQ_RunloopTableView.h
//  BathoathProject
//
//  Created by 葫芦娃 on 2021/6/17.
//

#import 

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 ()


@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;
}

文件位置
https://gitee.com/1023678795/runloop.git

你可能感兴趣的:(关于RunLoop Task模式实现列表优化)