OC中多執行緒執行順序的控制
OC中多執行緒主要使用的GCD和NSOperation和NSOperationQueue
GCD時基於C語音開發的一套多執行緒開發機制,時完全面向過程的。GCD統一管理整個佇列中的任務。GCD佇列分為並行佇列和序列佇列。
序列佇列:只有一個執行緒,加入到佇列中的操作按新增順序依次執行。
併發佇列:有多個執行緒,操作進來之後它會將這些佇列安排在可用的處理器上,同時保證先進來的任務優先處理。
NSOperation和NSOperationQueue進行多執行緒開發,只要將一個NSOperation(實際開中需要使用其子類NSInvocationOperation、NSBlockOperation)放到NSOperationQueue這個佇列中執行緒就會依次啟動。NSOperationQueue負責管理、執行所有的NSOperation,在這個過程中可以更加容易的管理執行緒總數和控制執行緒之間的依賴關係。
NSOperation有兩個常用子類用於創執行緒操作:NSInvocationOperation和NSBlockOperation,兩種方式本質沒有區別,但是是後者使用Block形式進行程式碼組織,使用相對方便。
簡單瞭解了GCD和NSOoperation 下面主要適演練一下在各自情況下的控制多執行緒的方法
/** * 序列非同步 * 序列:順心執行 非同步:會開執行緒 組合起來就是開一條執行緒順序執行 缺點只會開一條執行緒 */ -(void)demo1GCD{ //DISPATCH_QUEUE_CONCURRENT併發 DISPATCH_QUEUE_SERIAL//序列 NSString *indetify = @"indetify"; const char *label = [indetify UTF8String]; dispatch_queue_t queue = dispatch_queue_create(label, DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ NSLog(@"thread1:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }); dispatch_async(queue, ^{ NSLog(@"thread2:%@",[NSThread currentThread]); // [NSThread sleepForTimeInterval:1.0]; }); dispatch_async(queue, ^{ NSLog(@"thread3:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }); } /** * 分組控制執行緒的執行順心 */ -(void)demo2GCD { dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"group1:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"group2:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:5.0]; }); //分組裡面的現場執行完 才執行 dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"group4:%@",[NSThread currentThread]); }); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"group3:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }); } /** * addDependency 新增依賴控制執行緒執行順心 */ -(void)demoOperation { NSBlockOperation *oper1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation1:%@",[NSThread currentThread]); }]; NSBlockOperation *oper2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation2:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }]; NSBlockOperation *oper3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation3:%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }]; [oper1 addDependency:oper2]; [oper1 addDependency:oper3]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue setMaxConcurrentOperationCount:5];//設定執行緒併發量 [queue addOperation:oper1]; [queue addOperation:oper2]; [queue addOperation:oper3]; }
總結:
>在GCD中序列佇列中的非同步執行,可以方便地控制執行順序,但只會開一條執行緒。併發佇列在多個執行緒中執行(前提是使用非同步方法),順序控制相對複雜,但是效率更高。NSOperation中通過新增依賴不管是所有執行緒都順心執行還是某幾個併發先執行都很方便。
順便提一個幾個通知主執行緒更新UI的方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(
[NSOperationQueue mainQueue] addOperationWithBlock:
dispatch_sync(dispatch_get_main_queue(), ^{})