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);
}