多线程-NSOperation
NSOperation
NSOperation的使用:
NSOperation需要和和NSOperationQueue實現多線程編程
實現的具體步驟:
注意:NSOperation是一個抽象類,不具備分裝操作的能力必須使用它的子類
- NSInvocationOperation
- NSBlockOperation
- 自定義子類繼承NSOperation,實現內部相應的方法(-main方法)
這里介紹一下上面提到的操作 想到于GCD中的隊列,封裝一些你要中的事情(任務)
NSOperation各個子類的基本使用:
NSInvocationOperation
?
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {NSInvocationOperation *invovationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];[invovationOperation start]; }- (void)task {NSLog(@"%@", [NSThread currentThread]); }?
輸出結果:
2016-03-29 23:14:31.262 test1[1440:105145] <NSThread: 0x7fcba5101dc0>{number = 1, name = main}分析,說明使用NSInvocationOperation并不會開辟子線程執行封裝的任務,我們在看一下NSBlockOperation
?
NSBlockOperation的使用
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{for (int i = 0; i<3; i++) {NSLog(@"A------%@", [NSThread currentThread]);};}];[blockOp start];輸出結果:
2016-03-29 23:21:00.211 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main} 2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main} 2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main}分析得到結果:NSBlockOperation單獨使用也需要調用start方法,并且不會開辟子線程執行任務,但是我們看一下下面的情況,當block追加操作的時候,追加的操作會在子線程中執行并且是并發執行的
注意: 默認情況下,調用了start方法后并不會開一條新線程去執行操作,而是在當前線程同步執行操作 只有將NSOperation放到一個NSOperationQueue中,才會異步執行操作 并且內部會調用start方法 NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{for (int i = 0; i<3; i++) {NSLog(@"A------%@", [NSThread currentThread]);};}]; /********************************blcokOperation追加任務********************************/[blockOp addExecutionBlock:^{for (int i = 0; i<3; i++) {NSLog(@"B------%@", [NSThread currentThread]);};}]; /********************************blcokOperation追加任務********************************/[blockOp addExecutionBlock:^{for (int i = 0; i<3; i++) {NSLog(@"C------%@", [NSThread currentThread]);};}];[blockOp start];輸出結果:
2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main} 2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)} 2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)} 2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main} 2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main} 2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)} 2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)} 2016-03-29 23:24:58.884 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)} 2016-03-29 23:24:58.884 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}?
注意:只要NSBlockOperation封裝的操作數 > 1,就會異步執行操作
將操作添加進NSOperationQueue的使用
首先我們要靠接NSOperationQueue的兩種類型及創建方式
NSOperationQueue *queue = [NSOperationQueue mainQueue];
?注意:通過mainQueue 創建的隊列中的任務,不會創建子線程,在主隊列中執行
NSOperationQueue *queue = [[NSOperationQueue alloc] init];?注意:通過alloc init的方式創建的隊列會開啟子線程執行任務,并且是并發執行任務的,那么我們怎么向GCD中那樣讓隊列中的任務串行執行任務呢
那么可以以通過線面的屬性來設置最大的并發數 當值為1的時候,隊列會開啟子線程并且是串行執行隊列中的任務,在實際的開發,建議一般創建最多子線程的條數為3~5
queue.maxConcurrentOperationCount = 1;?
隊列的取消、暫停、恢復
?
操作依賴
?
操作的監聽
?
自定義NSOperation
?
自定義NSOperation下載圖片思路 – 無沙盒緩存
?
轉載于:https://www.cnblogs.com/mshong/p/5335399.html
總結
以上是生活随笔為你收集整理的多线程-NSOperation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Socket.io发送消息含义
- 下一篇: Hbase的基本认识