iOS NSOperation的基本使用
NSOperation的作用:
配合使用NSOperation和NSOperationQueue也能實現多執行緒程式設計
NSOperation和NSOperationQueue實現多執行緒的具體步驟:
先將需要執行的操作封裝到一個NSOperation物件中
然後將NSOperation物件新增到NSOperationQueue中
系統會自動將NSOperationQueue中的NSOperation取出來
將取出的NSOperation封裝的操作放到一條新執行緒中執行
NSOperation的子類
NSOperation是個抽象類,並不具備封裝操作的能力,必須使用它的子類
使用NSOperation子類的方式有3種
1.NSInvocationOperation
2.NSBlockOperation
3.自定義子類繼承NSOperation,實現內部相應的方法
NSInvocationOperation:
建立NSInvocationOperation物件
- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;
呼叫start方法開始執行操作
- (void)start;
一旦執行操作,就會呼叫target的sel方法
注意
預設情況下,呼叫了start方法後並不會開一條新執行緒去執行操作,而是在當前執行緒同步執行操作
只有將NSOperation放到一個NSOperationQueue中,才會非同步執行操作
-(void)invocationOpeation
{
//1.建立操作,封裝任務
/*
第一個引數:目標物件self
第二個引數:呼叫方法的名稱
第三個引數:前面方法需要接受的引數nil
*/
NSInvocationOperation*op1 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download1)object:nil];
NSInvocationOperation*op2 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download2)object:nil];
NSInvocationOperation*op3 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download3)object:nil];
//2.啟動|執行操作
[op1start];
[op2start];
[op3start];
}
NSBlockOperation:
建立NSBlockOperation物件
+ (id)blockOperationWithBlock:(void (^)(void))block;
通過addExecutionBlock:方法新增更多的操作
- (void)addExecutionBlock:(void (^)(void))block;
注意:只要NSBlockOperation封裝的運算元 > 1,就會非同步執行操作
-(void)blockOperation//1.建立操作
NSBlockOperation*op1 = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"1----%@",[NSThreadcurrentThread]);
}];
NSBlockOperation*op2 = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"2----%@",[NSThreadcurrentThread]);
}];
NSBlockOperation*op3 = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"3----%@",[NSThreadcurrentThread]);
}];
//追加任務
//注意:如果一個操作中的任務數量大於1,那麼會開子執行緒併發執行任務
//注意:不一定是子執行緒,有可能是主執行緒
[op3addExecutionBlock:^{
NSLog(@"4---%@",[NSThreadcurrentThread]);
}];
[op3addExecutionBlock:^{
NSLog(@"5---%@",[NSThreadcurrentThread]);
}];
[op3addExecutionBlock:^{
NSLog(@"6---%@",[NSThreadcurrentThread]);
}];
//2.啟動
[op1start];
[op2start];
[op3start];
}
NSOperationQueue的作用
NSOperation可以呼叫start方法來執行任務,但預設是同步執行的
如果將NSOperation新增到NSOperationQueue(操作佇列)中,系統會自動非同步執行NSOperation中的操作
新增操作到NSOperationQueue中
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;
什麼是併發數
同時執行的任務數
比如,同時開3個執行緒執行3個任務,併發數就是3
最大併發數的相關方法
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
取消佇列的所有操作
- (void)cancelAllOperations;
提示:也可以呼叫NSOperation的- (void)cancel方法取消單個操作
暫停和恢復佇列
- (void)setSuspended:(BOOL)b; // YES代表暫停佇列,NO代表恢復佇列
- (BOOL)isSuspended;
NSOperation之間可以設定依賴來保證執行順序
比如一定要讓操作A執行完後,才能執行操作B,可以這麼寫
[operationB addDependency:operationA]; // 操作B依賴於操作A
可以在不同queue的NSOperation之間建立依賴關係
可以監聽一個操作的執行完畢
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;
自定義NSOperation的步驟很簡單
重寫- (void)main方法,在裡面實現想執行的任務
重寫- (void)main方法的注意點
自己建立自動釋放池(因為如果是非同步操作,無法訪問主執行緒的自動釋放池)
經常通過- (BOOL)isCancelled方法檢測操作是否被取消,對取消做出響應
相關文章
- iOS - NSOperation與NSOperationQueueiOS
- 執行緒10--NSOperation的基本操作執行緒
- iOS UIScrollView的基本使用iOSUIView
- iOS - UILayoutGuide的基本使用iOSGUIIDE
- 玩轉iOS開發:iOS中的NSOperation開發(一)iOS
- 玩轉iOS開發:iOS中的NSOperation開發(二)iOS
- iOS WKWebView 基本使用iOSWebView
- iOS 多執行緒之NSOperationiOS執行緒
- iOS多執行緒NSOperation篇iOS執行緒
- iOS多執行緒程式設計之NSOperation和NSOperationQueue的使用iOS執行緒程式設計
- iOS 鑰匙串的基本使用iOS
- iOS多執行緒:NSOperation詳解iOS執行緒
- iOS Core Motion基本使用iOS
- IOS CoreLocation中CLLocationManager類的基本使用iOS
- iOS開發之使用Git的基本使用(二)iOSGit
- iOS開發之使用Git的基本使用(一)iOSGit
- Linux iostat命令基本使用LinuxiOS
- iOS開發-WKWebView的介紹與基本使用iOSWebView
- NSOperation 高階用法之NSOperation基礎(NSOperation原始碼分析)(上)原始碼
- NSOperation的進階使用和簡單探討
- iOS多執行緒(Pthread、NSThread、GCD、NSOperation)iOS執行緒threadGC
- iOS CocoaPods簡介及基本使用iOS
- iOS開發- UILabel的基本介紹與使用iOSUI
- iOS 多執行緒:『NSOperation、NSOperationQueue』詳盡總結iOS執行緒
- iOS多執行緒:『NSOperation、NSOperationQueue』詳盡總結iOS執行緒
- ios多執行緒程式設計(NSThread)(NSOperation )(GCD)iOS執行緒程式設計threadGC
- iOS開發-列表檢視的基本介紹與使用iOS
- iOS多執行緒程式設計——GCD與NSOperation總結iOS執行緒程式設計GC
- NSOperation的多執行緒使用以及和GCD的對比執行緒GC
- iOS UI-表格控制器(UITableView)-基本使用iOSUIView
- iOS 元件化開發(一):遠端私有庫的基本使用iOS元件化
- iOS UIView基本動畫iOSUIView動畫
- 多執行緒-NSOperation中使用ASIHttpRequest注意事項執行緒HTTP
- GCD與NSOperation之間的區別GC
- NSOperation, NSOperationQueue 原理探析
- 使用NSOperation和NSURLSession封裝一個序列下載器Session封裝
- Vuex的基本使用Vue
- mongoose的基本使用Go