一、runloop線程?;?/h1>
1.1 線程?;畹淖饔茫?/h2>
使用子線程時,如果任務非常頻繁,如檢測網絡狀態(tài),縮放,拖動等觸發(fā)的事件,切換不同子線程會消耗大量cpu,如果是同一個常駐線程則可以避免該問題
1.2 在線程中啟動一個runloop
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runLoopThreadEntryPoint:) object:nil];
[thread start];
//實現(xiàn)線程入口方法:在線程入口方法中,創(chuàng)建并啟動一個 RunLoop。例如
- (void)runLoopThreadEntryPoint:(id)object {
@autoreleasepool {
// Create an autoreleased NSRunLoop object
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
self.runloop = runloop;
// Add an input source to the run loop (for example, a timer or a custom input source)
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
// Run the run loop
[runLoop run];
}
}
1.3 插入任務
[NSObject performSelector: @selector(log) onThread: thread withObject: obj waitUntilDone: NO];
[runLoop performBlock:^{
if (block) block();
if (completion) completion();
dispatch_async(dispatch_get_main_queue(), ^{
self.renderTaskCount--;
if (isDrawBlock) [self flush];
});
}];
二、 CADisplayLink 同步屏幕刷新
前面大量任務產生結果,需要密集刷新顯示時,可以使用CADisplayLink優(yōu)化, CADisplayLink 與NStimer類似,不過前者同步屏幕刷新時間,如60hz的調用周期時1/60s
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
- (void)displayLinkCallback:(CADisplayLink *)displayLink {
// 在這里執(zhí)行需要執(zhí)行的任務,例如更新界面或者計算動畫狀態(tài)
}
三、其他
使用子線程時,如果任務非常頻繁,如檢測網絡狀態(tài),縮放,拖動等觸發(fā)的事件,切換不同子線程會消耗大量cpu,如果是同一個常駐線程則可以避免該問題
1.2 在線程中啟動一個runloop
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runLoopThreadEntryPoint:) object:nil];
[thread start];
//實現(xiàn)線程入口方法:在線程入口方法中,創(chuàng)建并啟動一個 RunLoop。例如
- (void)runLoopThreadEntryPoint:(id)object {
@autoreleasepool {
// Create an autoreleased NSRunLoop object
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
self.runloop = runloop;
// Add an input source to the run loop (for example, a timer or a custom input source)
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
// Run the run loop
[runLoop run];
}
}
1.3 插入任務
[NSObject performSelector: @selector(log) onThread: thread withObject: obj waitUntilDone: NO];
[runLoop performBlock:^{
if (block) block();
if (completion) completion();
dispatch_async(dispatch_get_main_queue(), ^{
self.renderTaskCount--;
if (isDrawBlock) [self flush];
});
}];
二、 CADisplayLink 同步屏幕刷新
前面大量任務產生結果,需要密集刷新顯示時,可以使用CADisplayLink優(yōu)化, CADisplayLink 與NStimer類似,不過前者同步屏幕刷新時間,如60hz的調用周期時1/60s
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
- (void)displayLinkCallback:(CADisplayLink *)displayLink {
// 在這里執(zhí)行需要執(zhí)行的任務,例如更新界面或者計算動畫狀態(tài)
}
三、其他
在多個任務持續(xù)輸入或輸出數據中,可以添加bool標識,即前一個任務未執(zhí)行完之前,下一個任務則跳過