博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RunLoop(运行循环)-002-加载大图
阅读量:4969 次
发布时间:2019-06-12

本文共 2278 字,大约阅读时间需要 7 分钟。

UI界面滑动视图时会卡顿,分析卡顿的原因

1.渲染图片耗时!! -- 分段加载图片!!

 每次Runloop循环,最多需要加载18张大图  所以卡住了

思路:

 每次Runloop循环,只渲染一张大图!!

 步骤:

 1.监听Runloop的循环!!

 2.将加载大图的代码!放在一个数组里面!!

 3.每次Runloop循环,取出一个加载大图的任务执行!!

在创建UI滑动视图之后调用: addRunloopObserver

typedef void(^runloopBlock)(void);//Ref 引用

@property(nonatomic,strong)NSMutableArray * tasks;

 

#pragma mark - <CFRunloop>

-(void)addTasks:(runloopBlock)task{

    [self.tasks addObject:task];

    if (self.tasks.count > 18) {//Runloop 最大加载18张大图

        [self.tasks removeObjectAtIndex:0];

    }

}

-(void)addRunloopObserver{

    //获取Runloop

    CFRunLoopRef runloop = CFRunLoopGetCurrent();

    //定义一个context

    CFRunLoopObserverContext context = {

        0,

        (__bridge void *)(self),

        &CFRetain,

        &CFRelease,

        NULL

    };

    //定义观察者

    static CFRunLoopObserverRef runloopObserver;

    runloopObserver = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, 0, &callBack, &context);

    //添加观察者

    CFRunLoopAddObserver(runloop, runloopObserver, kCFRunLoopCommonModes);

    //C里面 一旦creat new copy 有堆空间 需要自己手动释放

    CFRelease(runloopObserver);

}

void  callBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){

    //activity BeforeWaiting

    NSLog(@"%@",info);

    ViewController * vc = (__bridge ViewController *)info;

    if(vc.tasks.count == 0){

        return;

    }

    runloopBlock block = vc.tasks.firstObject;

    block();

    [vc.tasks removeObjectAtIndex:0];

}

使用

- (void)viewDidLoad {

    [super viewDidLoad];

    

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

    _tasks = [NSMutableArray array];

    //setupUI

    [self addRunloopObserver];

}

-(void)timerMethod{

    //不干任何事情!

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:IDENTIFIER];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    //干掉contentView上面的子控件!! 节约内存!!

    for (NSInteger i = 1; i <= 5; i++) {

        //干掉contentView 上面的所有子控件!!

        [[cell.contentView viewWithTag:i] removeFromSuperview];

    }

    //添加文字

    [ViewController addlabel:cell indexPath:indexPath];

    //添加图片

    [self addTasks:^{

        [ViewController addImage1With:cell];

    }];

    [self addTasks:^{

        [ViewController addImage2With:cell];

    }];

    [self addTasks:^{

        [ViewController addImage3With:cell];

    }];

    

    return cell;

}

转载于:https://www.cnblogs.com/StevenHuSir/p/RunLoop_LoadBigImage.html

你可能感兴趣的文章
判断文件类型
查看>>
python-GIL、死锁递归锁及线程补充
查看>>
.Net服务组件(ServicedComponent)简介及其使用
查看>>
Binding介绍
查看>>
JQuery实现可编辑的表格
查看>>
bzoj4903 [Ctsc2017]吉夫特
查看>>
java线程学习之wait方法
查看>>
ORM之Dapper操作Sql Server和MySql数据库
查看>>
2012/8/3SVN小入门
查看>>
HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)
查看>>
js随机数 从头开始系列
查看>>
19.网络策略控制
查看>>
《Programing in Lua》第一部分:CH1-CH10
查看>>
用 async/await 来处理异步
查看>>
手机网页制作需要注意的一点东西
查看>>
Winfon 页签切换及窗体控件自适应
查看>>
Open the Local Activity through the Browser
查看>>
MySQL 数据库的备份和恢复
查看>>
python读取绝对路径的三种方式
查看>>
模块的初始
查看>>