NSOperation - 02

NSOperationQueue作用:

NSOperation可以調用start方法來執行任務,但默認是同步執行的;如果將NSOperation添加到NSOperationQueue中,系統會自動異步執行NSOperation中的操作;


添加操作到NSOperationQueue中:

- (void)addOperation:(NSOperation *)p;

- (void)addOperationWithBlock:(void (^)(void))block;


最大併發數: 同時執行任務的最大數;開啓新線程的最大數;


隊列的取消、暫停、恢復:

取消操作:

- (void)cancelAllOperation;    (隊列方法,全部取消)

- (void)cancle;                (操作方法,取消單個操作)

暫停和恢復:

- (void)setSuspended(BOOL)b;    //YES代表暫停隊列,NO代表恢復隊列;

使用場景:在一個UITableView中,有加載數據圖片的時候,當你滑動表單時,可以暫停隊列任務,當你停止滑動,你就可以恢復隊列任務;

操作優先級:

1,設置NSOperationqueue中的優先級,可以改變操作的執行優先級;

- (NSOperationQueuePriority)queuePriority;

- (void)setQueuePriority:(NSOperationQueuePriority)p;

2,優先級的取值;

(1)NSOperationQueuePriorityVeryLow = -8L;

(2)NSOperationQueuePriorityLow = -4L;

(3)NSOperationQueuePriorityNormal = 0;

(4)NSOperationQueuePriorityHigh = 4;

(5)NSOperationQueuePriorityVeryHigh = 8;


操作依賴:

1NSOperation之間可以設置依賴來保證執行順序;

比如一定要讓操作A執行完後,才能執行操作B,可以這麼寫

[operationB addDependency:operationA];  //操作B依賴於操作A

2,可以不同queueNSOperation之間創建依賴關係;


監聽:

- (void)opeationListen

{

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

        for (int i = 0; i<10; i++) {

            NSLog(@"NSBlockOperation------下載圖片---%@", [NSThread currentThread]);

        }

    }];

    operation.completionBlock = ^{

        // ...下載完圖片後想做事情

        NSLog(@"NSBlockOperation------下載圖片完畢---%@", [NSThread currentThread]);

    };

    

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperation:operation];

}


自定義NSOperation:

當我們不想用系統給我們的Operation,我們可以自定義NSOperation,在下載圖片的過程就可以用到;


1,重寫 - (void)main函數;

注意:(1)因爲如果void函數裏面執行的是子線程(異步)操作,而autoreleasepool在主線程中,無法訪問主線程的自動釋放池,所以最好在- (void)main中創建一個@autoreleasepool{};

(2)經常通過-(BOOL)isCancelled方法檢測操作是否被取消,對取消做出響應;

代碼:

/**

 *  main方法中實現具體操作

 */

- (void)main

{

    @autoreleasepool {

        

        NSURL *downloadUrl = [NSURL URLWithString:self.url];

        NSData *data = [NSData dataWithContentsOfURL:downloadUrl]; // 這行會比較耗時

        UIImage *image = [UIImage imageWithData:data];


        if ([self.delegate respondsToSelector:@selector(downloadOperation:didFinishDownload:)]) {

            dispatch_async(dispatch_get_main_queue(), ^{ // 回到主線程, 傳遞圖片數據給代理對象

                [self.delegate downloadOperation:self didFinishDownload:image];

            });

        }

    }

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章