標籤:
多線程之NSOperation:
多線程的優點:
- 使用線程可以把佔據時間長的程式中的任務呀放到後台去處理
- 使用者介面可以更加吸引人,這樣比如使用者點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
- 程式的運行速度可能加快
- 在一些等待的任務實現上如使用者輸入、檔案讀寫和網路收發資料等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如記憶體佔用等等。
多線程的缺點:
- 如果有大量的線程,會影響效能,因為作業系統需要在它們之間切換。
- 更多的線程需要更多的記憶體空間。
- 線程可能會給程式帶來更多“bug”,因此要小心使用。
- 線程的中止需要考慮其對程式啟動並執行影響。
- 通常塊模型資料是在多個線程間共用的,需要防止線程死結情況的發生。
使用NSOperation和NSOperationQueue實現多線程
- 建立NSOperation
- 把建立的NSOperation對象方法添加到NSOperationQueue中
- 系統自動去NSOperationQueue操作隊列中取到一個NSOperation對象,並開啟一個分線程去執行操作
注意:
- NSOperation是一個抽象類別,不具備建立對象的能力。
- 我們可以使用NSOperation的子類去建立對象(NSInvocationOperation, NSBlockOperation)
- 我們也可以自訂NSOperation
NSInvocationOperation
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];[operation start];
NSInvocationOperation建立的對象預設實在主線程中執行。
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];NSOperationQueue *queue = [[NSOperationQueue alloc]init];[queue addOperation:operation1];[queue addOperation:operation2];
將操作放入隊列中,在分線程中執行。
[queue setMaxConcurrentOperationCount:5];
隊列以此可以最多執行的分線程。超出,則先執行完,在執行多餘的。
NSBlockOperation
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ [NSThread sleepForTimeInterval:5]; NSLog(@"方法 :%d",[NSThread isMainThread]); }];[operation2 start];
NSBlockOperation建立的對象預設是在主線程中執行的。
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ [NSThread sleepForTimeInterval:5]; NSLog(@"方法 :%d",[NSThread isMainThread]); }];[operation2 addExecutionBlock:^{ [NSThread sleepForTimeInterval:5]; NSLog(@"方法1 :%d",[NSThread isMainThread]); }];[operation2 start]
我們可以在block中添加其它任務,其它任務正常情況下是在分線程中執行。
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"方法1 :%d",[NSThread isMainThread]); }];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"方法2 :%d",[NSThread isMainThread]); }]; NSOperationQueue *queue = [[NSOperationQueue alloc]init];[queue addOperation:operation1];[queue addOperation:operation2];
這樣建立的方法都在分線程中執行。
自訂NSOperation對象
我們需要建立一個類,繼承自NSOperation.
在類中實現-(void)main(){//實現的內容}
myOperation *operation1 = [[myOperation alloc]init];myOperation *operation2 = [[myOperation alloc]init];myOperation *operation3 = [[myOperation alloc]init];NSOperationQueue *queue = [[NSOperationQueue alloc]init];[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];
我們可以設定操作對象的執行順序。
- 通過依賴關係
- 通過優先順序
[operation1 addDependency:operation2];
operation1依賴operation2,先執行operation2,再執行operation1
[operation3 setQueuePriority:NSOperationQueuePriorityHigh];
設定operation3的優先順序
取消操作
[operation1 cancel];
取消某個操作。
[queue cancelAllOperations];
取消隊列中的所有操作。
暫停操作
[queue setSuspended:YES];[queue setSuspended:NO];
iOS-多線程(2)