Runloop 新的見解

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

}

相關文章
相關標籤/搜索