CFRunloop 优化TableView加载高清大图UI卡顿问题。单独分批加载(1)

最后

除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。

const void *(*retain)(const void *info);

void (*release)(const void *info);

CFStringRef (*copyDescription)(const void *info);

} CFRunLoopObserverContext;

**/

CFRunLoopObserverContext  context = {

0,

(__bridge void *)(self),

&CFRetain,

&CFRelease,

NULL

};

//创建Runloop观察者  kCFRunLoopBeforeWaiting  观察在等待状态之前  runloop有下面几种状态 看英文应该知道了。

/*

kCFRunLoopEntry = (1UL << 0),

kCFRunLoopBeforeTimers = (1UL << 1),

kCFRunLoopBeforeSources = (1UL << 2),

kCFRunLoopBeforeWaiting = (1UL << 5),

kCFRunLoopAfterWaiting = (1UL << 6),

kCFRunLoopExit = (1UL << 7),

kCFRunLoopAllActivities = 0x0FFFFFFFU

*/

static CFRunLoopObserverRef  obserberRef;

obserberRef =CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, 0,&callback, &context);

//给当前runloop添加观察者

CFRunLoopAddObserver(currentRunloop, obserberRef, kCFRunLoopDefaultMode);

//释放观察者

CFRelease(obserberRef);

}

//观察回调

static void callback(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){

ViewController * vcSelf = (__bridge ViewController *)(info);

if (vcSelf.TaskMarr.count > 0) {

//获取一次数组里面的任务并执行

runloopTask  task  =  vcSelf.TaskMarr.firstObject;

task();

[vcSelf.TaskMarr removeObjectAtIndex:0];

}else{

return;

}

}

代码分析:

  • 先推理下,如果我要把任务放到Runloop里操作,首先我要获取Runloop。

  • 然后我们需要一个观察者,找一个时机把任务放进去。如果对runloop了解的话,会想到CFRunLoopObserver.然后我们创建一下这个观察者对象。

  • 然后把观察者扔进runloop,这样我们就能拿到,Runloop等待之前的回调。

  • 然后把任务扔到回调中。

注意:这样还没有结束,还有一个问题待解决。那就是runloop运行一次任务就会休眠了。不会把你数组队列的任务进行处理。所以你要让Runloop不断的运行,直到你的任务结束。

方案如下:

//给runloop一个事件源,让Runloop不断的运行执行代码块任务。

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(runloopalive) userInfo:nil repeats:YES];

//如果方法里什么都不干,APP性能影响并不大。但cpu增加负担,

-(void)runloopalive{

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值