RunLoop的应用:1.NSTimer 2.UIImageView延迟加载图片 3.后台常驻线程
UIImageView延迟加载图片
想象一下,一个UITableView上每个Cell上有多张图片质量比较大的图片(图片已经下载到本地),在滑动tableView的时候,由于图片质量大图片的解压和渲染都相当耗时,这些操作会阻塞主线程从而到时滑动tableView的时候出现卡顿的现象,要想在滑动的时候不卡顿,我们可以在滑动的时候不进行加载图片的耗时操作,而只在不滑动的时候加载。这时就要用到UIImageView的延迟加载图片。
代码:
[self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"0.头像"] afterDelay:3 inModes:@[NSDefaultRunLoopMode]];
设置RunLoop模式为NSDefaultRunLoopMode,这样当滑动屏幕上的滑动控件的时候,UIImageView就不会进行加载图片的操作。
demo地址 ***https://gitee.com/liangsenliangsen/uiimageview_delayed_loading.git
大家可以可以看下小demo,demo中的代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor greenColor];
UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(100, 50, 100, 50)];
[self.view addSubview:textView];
textView.text = @"复健科拉设计费了就离开房间爱SDK接口浪费时间卡视角分开了啥就废了可视对讲适得府君书大路口附近打扫房间施蒂利克荆防颗粒三大房间里看电视附近克里斯大放房间里SD卡荆防颗粒是打飞机附近克里斯大姐夫可拉伸的附近考虑到撒九分裤乐山大佛;";
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 300, 50, 50)];
[self.view addSubview:imageView];
imageView.backgroundColor = [UIColor redColor];
_imageView = imageView;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"0.头像"] afterDelay:3 inModes:@[NSDefaultRunLoopMode]];
}
当点击屏幕的时候本来是要进行加载图片的操作的(点击屏幕后3秒),这是我们去滑动UITextView,我们可以滑动时间超过3秒,发现UIImageView并没有去加载图片,在我们停止滑动textView才去加载了图片。达到了延迟加载的效果。
后台常驻线程
直接看代码吧
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor greenColor];
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(run1) object:nil];
[self.thread start];
}
- (void)run1{
NSLog(@"开始任务...");
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
NSLog(@"没有开启RunLoop...");
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self performSelector:@selector(run2) onThread:self.thread withObject:nil waitUntilDone:NO];
}
- (void)run2{
NSLog(@"另一个任务...说明常驻线程并没有被销毁");
}