首页 > 代码库 > Runloop 新的看法

Runloop 新的看法

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

}

 

Runloop 新的看法