1.Runloop --运行循环
Runloop能做的事情:
1.让程序一直运行
2.处理触摸事件:(UI交互,闹钟,网络等等)
3.处理渲染事件:(每一次渲染的时候,重新加载所有的屏幕上的点)
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
// NSDefaultRunLoopMode; 一般处理闹钟,网络
// NSRunLoopCommonModes 处理用户UI交互(很好的处理时钟,网络在UI交互卡顿不动的情况)
[[NSRunLoop currentRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
// [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];//自动添加到运行池
//更新UI是在主线程加载的,加载网络是在子线程加载的
如果更新UI的时候也是个很耗时间的操作的时候,如何解决?
1.第一次加载以后,可以将数据(图片,文字,头像)保存到本地,第二次直接通过本地加载。
2.针对多个图片或者cell 很耗时的时候,可以通过Runloop每次加载一个,这样会大大节约时间
如何解决:
1.通过数组,装代码
2.返回cell数据源,不加载图片(加载图片的代码放到数组)
3.监听RunLoop(通过CFRunLoop) ---一次循环就从数组拿代码执行
OC的监听方法有:通知,代理,KVO
C语言:通过函数指针监听
//定义一个函数监察指针,回调函数
static void callBack()
{
//处理回调方法
}
//添加runLoop
-(void)defeafutRunLoopObsever
{
//获取当前的runLoop(C语言的)
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
//定义一个上下文
CFRunLoopObserverContext context = {
0,
(__bridge void *)(self),//观察者(self)要桥接
&CFRetain,
&CFRelease,
NULL,
};
//定义一个观察者
static CFRunLoopObserverRef defaultModleObesver;
//创建观察者
defaultModleObesver = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, NSIntegerMax -999, &callBack, &context);
//添加当前RunLoop观察者
CFRunLoopAddObserver(runLoop, defaultModleObesver, kCFRunLoopCommonModes);
//c语言对于使用creat/new/copy 记得释放内存
CFRelease(defaultModleObesver);
}