关键词:
处理逻辑:
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之间进行分页时,它会... 查看详情