NSOperation和GCD是同樣的,也是蘋果提供給咱們的一套多線程解決方案。實際上它也是基於GCD開發的,可是比GCD擁有更強的可控性和代碼可讀性。安全
①繼承NSOperation的MyOperation。多線程
MyOperation *operation = [[MyOperation alloc]init]; //開始執行 [operation start]; //取消執行 [operation cancel]; //執行結束後調用的Block [operation setCompletionBlock:^{ NSLog(@"執行結束"); }];
② NSInvocationOperation使用方式和給Button添加事件類似,須要一個對象和一個Selector。NSInvocationOperation實際上是同步執行的,所以單獨使用的話,並無什麼做用。併發
NSInvocationOperation *invoOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil]; [invoOperation start];
- (void)download { //執行操做 }
③NSBlockOperation支持併發的執行一個或多個block異步
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ //執行操做 }]; [blockOperation addExecutionBlock:^{ //執行操做 }]; [blockOperation addExecutionBlock:^{ //執行操做 }];
NSOperationQueue就是執行NSOperation的隊列,一般狀況下,是不會單獨使用上面的operation的,咱們會將一個或多個NSOperation對象放到隊列中去執行。這時NSInvocationOperation 和 NSBlockOperation都是異步執行的且都在子線程中執行。放入隊列中的NSOperation對象不須要調用start
方法,NSOPerationQueue會在「合適」的時機自動調用。spa
NSInvocationOperation *invoOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil]; [invoOperation start]; NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ //執行操做 }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //設置最大併發數 queue.maxConcurrentOperationCount = 1; [queue addOperation:invoOperation]; [queue addOperation:blockOperation];
注意:線程
1.設置queue的暫停只需設置屬性suspended爲YES或NO;code
2.取消能夠調用某個NSOperation的cancle
方法,也能夠調用Queue的cancelAllOperations
方法來取消所有線程;對象
3.所謂的暫停和取消並不會當即暫停或取消當前操做,而是不在調用新的NSOperation;blog
4.改變queue的maxConcurrentOperationCount能夠設置最大併發數。但最大併發數是有上限的,即便你設置爲1000,也不會超過其上限,而這個上限的數目也是由具體的運行環境決定的;繼承
5.設置最大併發數必定要在NSOperationQueue初始化後當即設置,由於被放到隊列中的NSOperation對象是由隊列本身決定什麼時候執行的,有可能你這邊一添加立馬就被執行。所以要想讓設置生效必定要在初始化後當即設置。
假如A依賴於B,那麼A將會在B執行結束以後纔會執行。不要創建循環依賴,會形成死鎖,緣由同循環引用。
[invoOperation1 addDependency: invoOperation2];