SDWebImage之RunLoop

↘锁芯ラ 提交于 2019-12-01 18:53:59

在SDWebImage中的SDWebImageDownloaderOperation的start函数中,调用了CFRunLoopRun(),我们来看一下CFRunLoopRun到底是做什么的,起到了什么作用。

每一个线程有一个runloop,既不可以创建,也不能销毁线程的runloop。Core Foundation根据需求为你创建,通过CFRunLoopGetMain可以获得当前线程的runloop。调用CFRunLoopRun可以使当前线程的runloop以默认模式运行起来,直到调用CFRunLoopStop来停止runloop。你也可以调用CFRunLoopRunInMode来使当前线程的runloop以指定模式运行起来一段时间或者直到runloop被停止。【runloop只能在请求模式至少有一个source或者timer可监控的情况下运行起来。】

一般主线程会自动运行runloop,我们一般情况下不会去管。在其他子线程中,如果需要我们需要去管理。使用runloop后,可以把线程想象成进入了一个循环;如果没有这个循环,子线程完成任务后,这个线程就结束了。所以如果需要一个线程处理各种事件而不让它结束,就需要运行runloop。

在SDWebImageDownloaderOperation中,

1234567891011
- (void)start{	...	self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO];	...		if(self.connection){		...		CFRunLoopRun()		...	}}
12345
- (void)cancelInternalAndStop {    if (self.isFinished) return;    [self cancelInternal];    CFRunLoopStop(CFRunLoopGetCurrent());}

在创建self.connection成功后,执行了CFRunLoopRun(),开启了runloop。在failed或finished的时候会调用CFRunLoopStop停止runloop。如果不开启runloop的话,在执行完start()后任务就完成了,NSURLConnection的代理就不会执行了。runloop相当于子线程的循环,可以灵活控制子线程的生命周期。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!