1.Runloop --运行循环数组
Runloop能作的事情:网络
1.让程序一直运行函数
2.处理触摸事件:(UI交互,闹钟,网络等等)oop
3.处理渲染事件:(每一次渲染的时候,从新加载全部的屏幕上的点)spa
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];server
// [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);
}