你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS多線程之NSOperation

iOS多線程之NSOperation

編輯:IOS開發綜合

1.NSOperation的理解

NSOperation本身是一個抽象的基類,我們要自己子類化NSOpeartion並封裝我們要完成的任務,系統提供了兩個比較方便的子類NSInvocationOperation和NSBlockOperation,NSInvocationOperation方便我們以現有的方法來初始化一個operation,NSBlockOperation是方便我們從Block來初始化operation。所有的NSOperation都有如下特征:
支持NSOperation對象之間建立依賴關系,當一個operation的所有依賴的operation都執行完了自己才會執行。支持可選的completion block,當operation的主任務完成之後調用。支持通過KVO通知來監控operation的執行狀態。支持指定operaion的優先級來安排operation的相對指向順序。支持operation的取消操作來停止operation執行。

2.NSOperation的執行

通常情況下我們要並發執行的話只要簡單的把operation添加到operation queue中就行,operation queue負責創建線程並發地執行operation任務。
MyOperation *operation = [MyOperation alloc] init];
NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
[aQueue addOperation:operation];
我們也可以直接通過NSOpeartion的start方法來處理operation任務,這樣執行的話任務的處理是在start調用的線程中同步執行的。
MyOperation *operation = [MyOperation alloc] init];
[operation start];
isConcurrent屬性返回的就是operation要執行的任務相對於調用start的線程是同步的還是異步的,isConcurrent默認返回NO。當然我們也可以自己創建線程來執行NSOperation的start方法達到並發執行的效果。

3.NSInvocationOperation的使用

@implementation MyCustomClass
- (NSOperation*)taskWithData:(id)data 
{
    NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data];
   return theOp;
}
// This is the method that does the actual work of the task.
- (void)myTaskMethod:(id)data 
{
    // Perform the task.
}
@end

4.NSBlockOperation的使用

NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^
{
    NSLog(@"Beginning operation.\n");
    // Do some work.
}];
NSBlockOperation可以通過addExecutionBlock:方法添加多個block,只有所有block都執行完成的時候,operation才算是完成。

5.自定義NSOperation

NSOperation提供了一個基本結構,具體相關的並發執行的方法、operation依賴、KVO通知和取消操作還是需要我們自己實現的。整個NSOperation子類實現如下:
@interface MyOperation : NSOperation {
    BOOL        executing;
    BOOL        finished;
}
- (void)completeOperation;
@end
@implementation MyOperation
- (id)init {
    self = [super init];
    if (self) {
        executing = NO;
        finished = NO;
    }
    return self;
}
- (void)start {
    // Always check for cancellation before launching the task.
    if ([self isCancelled])
    {
        // Must move the operation to the finished state if it is canceled.
        [self willChangeValueForKey:@"isFinished"];
        finished = YES;
        [self didChangeValueForKey:@"isFinished"];
        return;
    }
    // If the operation is not canceled, begin executing the task.
    [self willChangeValueForKey:@"isExecuting"];
    [self main];
    executing = YES;
    [self didChangeValueForKey:@"isExecuting"];
}
- (void)main {
    @autoreleasepool {
        BOOL isDone = NO;
        while (![self isCancelled] && !isDone) {
            // Do some work and set isDone to YES when finished
        }
        [self completeOperation];
   }
}
- (void)completeOperation {
    [self willChangeValueForKey:@"isFinished"];
    [self willChangeValueForKey:@"isExecuting"];
    executing = NO;
    finished = YES;
    [self didChangeValueForKey:@"isExecuting"];
    [self didChangeValueForKey:@"isFinished"];
}
- (void)cancel {
    [super cancel];
    //取消網絡請求    
}
- (BOOL)isConcurrent {
    return YES;
}
- (BOOL)isExecuting {
    return executing;
}
- (BOOL)isFinished {
    return finished;
}
@end
並發operation需要實現以下方法:
startmainisConcurrentisExecutingisFinished NSOperation支持KVO的屬性有:
isCancelledisConcurrentisExecutingisFinishedisReadydependenciesqueuePrioritycompletionBlock 不是所有的屬性都要我們發送KVO通知,如果我們覆蓋了start方法,就要像上面的代碼一樣在適當的地方發出isExecuting和isFinished的通知。如果我們實現了自己的addDependency:或者removeDependency:,就要適當的地方發送dependencies的通知。

6.配置NSOperation

6.1依賴管理

我們可以通過addDependency:給當前operation添加依賴operation,依賴關系不限於operation是否在一個隊列裡。注意我們不要自己生成循環依賴,這樣會造成死鎖。

6.2優先級管理

在隊列裡的operation的執行順序取決於operation的狀態(是否准備就緒)和相對優先級。是否准備就緒取決於operation的依賴operation是否完成,執行隊列會優先考慮operation,如果高優先級的operation沒有准備就緒,執行隊列就會先執行低優先級的operation。operation的相對優先級只針對同一隊列,就是說一個低優先級的operation可能比另一個隊列裡高優先級的operation優先執行。

6.3底層線程優先級管理

我們可以通過setThreadPriority:設置operation系統級別的線程優先級,優先級由0.0到1.0浮點數指定,默認是0.5。我們自己設置的系統級別的線程優先級只針對main方法執行期間有效,其他方法都是按照默認優先級執行。


參考鏈接:Concurrency Programming Guide

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved