uitableview优化--使用runloop,优化耗时较多的事件(代码片段)

Eric博客 Eric博客     2022-12-11     474

关键词:

处理逻辑:

runloop运行循环,每次循环的时候都会处理多个cell的显示,现在需要每次循环只处理一个cell的显示

头文件.h

//
//  HMCRunLoopTask.h
//  test
//
//  Created by 胡梦驰 on 2018/7/13.
//  Copyright © 2018年 胡梦驰. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void(^RunloopBlock) (void);

@interface HMCRunLoopTask : NSObject

//添加任务
- (void)addTask:(RunloopBlock)task;

//开始定时器
- (void)startTimer;

//结束定时器
- (void)endTimer;

@end

实现文件.m

//
//  HMCRunLoopTask.m
//  test
//
//  Created by 胡梦驰 on 2018/7/13.
//  Copyright © 2018年 胡梦驰. All rights reserved.
//

#import "HMCRunLoopTask.h"

#define MaxTaskCount 10
@interface HMCRunLoopTask()

@property (nonatomic, strong) NSMutableArray *taskArray;
@property (nonatomic, strong) NSTimer *timer;

@end

@implementation HMCRunLoopTask

- (instancetype)init
    if(self=[super init])
        self.taskArray = [NSMutableArray array];
        [self addRunloopObverser];
    
    return self;


- (void)timerMethod
    //什么事情也不做!
    NSLog(@"runlooptask timer 还在repeat,没有杀掉");


//开始定时器
- (void)startTimer
    if(self.timer)
        [self.timer invalidate];
        self.timer = nil;
    
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];


//结束定时器
- (void)endTimer
    [self.timer invalidate];


#pragma mark - <关于C语言Runloop>
//添加任务
- (void)addTask:(RunloopBlock)task
    [self.taskArray addObject:task];
    if(self.taskArray.count > MaxTaskCount)
        [self.taskArray removeObjectAtIndex:0];
    

//回调方法
static void callBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
    HMCRunLoopTask *vc = (__bridge HMCRunLoopTask*)info;
    if(vc.taskArray.count==0)
        return;
    
    RunloopBlock task = vc.taskArray.firstObject;
    task();
    [vc.taskArray removeObjectAtIndex:0];


//添加Runloop
- (void)addRunloopObverser
    //拿到当前的Runloop
    CFRunLoopRef runloop = CFRunLoopGetCurrent();
    CFRunLoopObserverContext context = 
        0,
        (__bridge void *)(self),
        &CFRetain,
        &CFRelease,
        NULL
    ;
    
    //定义一个观察者,static内存中只存在一个
    static CFRunLoopObserverRef obverser;
    //创建一个观察者
    obverser = CFRunLoopObserverCreate(NULL, kCFRunLoopAfterWaiting, YES, 0, &callBack, &context);
    //添加观察者!!!
    CFRunLoopAddObserver(runloop, obverser, kCFRunLoopCommonModes);
    
    //release
    CFRelease(obverser);


@end


实现实例:


@interface ViewController ()

@property (nonatomic, strong) HMCRunLoopTask *runloopTask;

@end

@implementation SoldOutBidController

- (void)viewWillAppear:(BOOL)animated
    [super viewWillAppear:animated];
    [self.runloopTask startTimer];


- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    [self.runloopTask endTimer];


- (void)viewDidLoad 
    [super viewDidLoad];
    self.runloopTask = [[HMCRunLoopTask alloc] init];
    // Do any additional setup after loading the view from its nib.


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    __weak typeof(self) weakSelf = self;
    //将耗时的事件添加到runloop中
    [self.runloopTask addTask:^
        [cell updateDisplayModelShouKong:weakSelf.bidArray[indexPath.row]];
    ];


利用runloop优化流畅度

...dLoad];    self.view.backgroundColor=[UIColorredColor];    UITableView*ta 查看详情

tableview加载图片优化(滑动不加载图片思路)

...调用给imageView赋值的方法,就能避免滑动时加载图片导致UITableView滚动卡顿的问题2.利用Runloop在UIScrollView滑动时和App默认运行时的Model不同来实现利用PerformSelector设置当前线程的Runloop的运行模式,NSDefaultRunLoopMode:App的默认运行模式... 查看详情

开源库uitableview+fdtemplatelayoutcell学习

摘自:优化UITableViewCell高度计算Swift版、优化UITableViewCell高度计算的那些事 本文带大家详细探索那篇文章所对应的库(1.2版),这个库就是利用缓存tableviewcell的高度提高滑动的流畅性。主要是利用Runloop在空闲状态时,后台计算... 查看详情

runloop实践

Runloop主要负责:1、保证程序不退出;2、负责监听事件,如触摸事件,计时器事件,网络事件等;3、负责渲染屏幕上所有的UI,一次Runloop循环,需要渲染屏幕上所有变化的像素点;4、节省CPU的开销,该程序该工作时工作,该休... 查看详情

ios性能优化-runloop卡顿检测(代码片段)

????????关注后回复 “进群” ,拉你进程序员交流群????????作者丨Jerod来源:https://segmentfault.com/a/1190000040415354卡顿主要表现为主线程卡死,不响应用户动作或者响应很慢,这种体验很差,会让用户对产品的认可... 查看详情

怎样优化uitableview的性能

 在iOSApp中,UITableView应该是使用率最高的。同一时候也是最为复杂的视图。差点儿全部自带的应用中都能看到它的身影,可见它的重要性。  在使用UITableView时,会常常遇到性能上的问题,普遍表如今滚动时比較卡。特别是ta... 查看详情

uitableview的性能优化

UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时。本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文将持续更新,力求将tableview的优化做到极... 查看详情

uitableview的性能优化1

UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时。本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文将持续更新,力求将tableview的优化做到极... 查看详情

ios中runloop总结(二)

参考技术ARunLoop的主要目的:保证程序执行的线程不会被系统终止,如果没有RunLoop,UIApplicationMain函数执行后将直接返回,就是说程序一启动后就结束。Runloop的mode作用是什么?用来指定事件在运行循环中的优先级的。线程的运... 查看详情

IOS优化加载图片到UITableView

】IOS优化加载图片到UITableView【英文标题】:IOSoptimalizationloadingImagesintoUITableView【发布时间】:2013-06-0215:40:42【问题描述】:您好,我在UITableViewCells中加载图像时遇到问题。当然,我对我的单元格使用dequeueReusableCellWithIdentifier。... 查看详情

runloop的启动与对应的退出方式

参考技术A来源:iOS开发-RunLoop的退出方式启动一个runloop有以下三种方法:-(void)run;-(void)runUntilDate:(NSDate*)limitDate;-(BOOL)runMode:(NSRunLoopMode)modebeforeDate:(NSDate*)limitDate;(1)第一种方式,runloop会一直运行下去,在此期间会处理来自输入源的... 查看详情

uitableview调优

UITableView的优化主要从三个方面入手:提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;滑动时按需加载,这个在大量图片展示,网络... 查看详情

uitableview优化

内建方法: 重用: cell header footer 在dataSource代理中实现的tableView:cellForRowAtIndexPath:方法 1.应尽可能快的返回重用cell实例,因为该方法会被每个cell调用一次。 2.不要在这里执行数据绑定,因为绑定了也没用,cell都还没在屏... 查看详情

runloop的学习总结

一.RunLoop相关概念1.什么是RunLoopRunLoop与线程相关且是基础框架的一部分。一个RunLoop就代表一个事件处理循环,它可以不停的调度工作以及处理输入事件。使用RunLoop的目的是有效的控制线程的执行和休眠,让线程在有工作... 查看详情

英语run和runtime区别是啥?

Runloop是事件接收和分发机制的一个实现。Runloop提供了一种异步执行代码的机制,不能并行执行任务。在主队列中,MainRunLoop直接配合任务的执行,负责处理UI事件、定时器以及其他内核相关事件。(1).RunLoop的主要目的:保证程序... 查看详情

iosrunloop总结

...有任务执行。在iOS和OSX中,这个消息循环的机制便被称为RunLoop。RunLoop可以保持程序的持续运行,它负责处理事件和消息,可以让线程在没有消息的时候休眠,在有消息的时候才唤醒做事,以节省CPU资源。iOS系统中,提供了2套API... 查看详情

runloop的学习总结

一.RunLoop相关概念1.什么是RunLoopRunLoop与线程相关且是基础框架的一部分。一个RunLoop就代表一个事件处理循环,它可以不停的调度工作以及处理输入事件。使用RunLoop的目的是有效的控制线程的执行和休眠,让线程在有工作... 查看详情

如何优化 UITableViewCell,因为我的 UITableView 滞后

】如何优化UITableViewCell,因为我的UITableView滞后【英文标题】:HowtooptimizeUITableViewCell,becausemyUITableViewlags【发布时间】:2018-04-0118:07:08【问题描述】:好的,我的UITableView加载太复杂了。当在UIPageViewController之间进行分页时,它会... 查看详情