1. 程式人生 > >iOS處理耗時操作一種簡單方法

iOS處理耗時操作一種簡單方法

在開發過程中,我們經常會遇到一下耗時的操作,比如說檔案的上傳、下載、壓縮、解壓縮等過程,開發過藍芽的小夥伴都知道藍芽的操作也是一個耗時的操作,尤其是那些以藍芽為工具的專案,比如說藍芽在智慧家居中的使用,這些都是耗時的操作。有時候我們需要對這些耗時的操作精準的加以控制,這時候大多數人都會想到用多執行緒來處理,那麼怎樣才能用相對簡單的程式碼來實現對這些耗時操作的控制呢?

在OC中有很多方法都能實現,這裡我只說我經常用的NSOperation和NSOperationQueue相結合的方法

這裡是通過NSOperation的子類,通過相關程式碼來控制它的狀態(如果對NSOperation的四種狀態不瞭解的童鞋可以自行補腦,這裡就不多說了)來實現,下面是宣告檔案內容

#import "HJBlockOperation.h"

#import <Foundation/Foundation.h> @class HJBlockOperation; typedef void (^continueBlock)(HJBlockOperation *con); @interface HJBlockOperation : NSOperation //仿NSOperation的四種狀態 寫出自己可以控制的對應的狀態屬性(ready狀態暫時用不到,就不寫了,其實最主要的就一個:isFinished,只有這個狀態變成YES,才證明這個操作完成了) @property(nonatomic ,assign , getter = isFinished)BOOL hjFinished; @property(nonatomic ,assign , getter = isExecuting)BOOL hjExecuting; @property(nonatomic ,assign , getter = isConcurrent)BOOL hjConcurrent; @property(nonatomic, copy) continueBlock myBlock; - (void)continueWithBlock:(continueBlock)blk; @end
實現方法也是很簡單,只需要這寫程式碼
#import "HJBlockOperation.h"


@implementation HJBlockOperation
-(void)main
{
    @autoreleasepool {
        
        if (self.isCancelled) {
            return;
        }
        
        _hjConcurrent =YES;
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.myBlock(self);
        }];
        
    }
}

-(void)continueWithBlock:(continueBlock)blk
{
    if (blk) {
        self.myBlock = blk;
    }
}

- (void)setHjFinished:(BOOL)hjFinished
{
    [self willChangeValueForKey:@"isFinished"];
    _hjFinished = hjFinished;
    [self didChangeValueForKey:@"isFinished"];
}

- (void)setHjExecuting:(BOOL)hjExecuting
{
    [self willChangeValueForKey:@"isExecuting"];
    _hjExecuting = hjExecuting;
    [self didChangeValueForKey:@"isExecuting"];
}

- (void)setHjConcurrent:(BOOL)hjConcurrent
{
    _hjConcurrent = hjConcurrent;
}

@end


呼叫時候是這樣的:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = 1;
    
    NSMutableArray *operaArray = [NSMutableArray array];
    for (int index = 0; index < 1; index ++) {
        
        HJBlockOperation *blo = [[HJBlockOperation alloc] init];
        
        [blo continueWithBlock:^(HJBlockOperation *con) {
            
            NSLog(@"第%d條任務開始",index + 1);
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                
                NSLog(@"第%d條任務結束",index + 1);
                
                //等任務結束後呼叫這句程式碼,就標明此操作已結束
                blo.hjFinished = YES;
            });
            
        }];
        
        [operaArray addObject:blo];
    }
    
    
    HJBlockOperation *operation = [[HJBlockOperation alloc] init];
    
    [operation continueWithBlock:^(HJBlockOperation *con) {
        
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://ppt.downhot.com/d/file/p/2014/08/16/0b999aee4d45bc266637043b7cf04654.jpg"]];
        NSLog(@"開始下載圖片");
        if (data) {
            operation.hjFinished = YES;
            
            NSLog(@"下載完了");
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                _imageView.image = [UIImage imageWithData:data];
                
            });
        }
    }];
    [operaArray addObject:operation];
    
    [queue addOperations:operaArray waitUntilFinished:NO];