マルチスレッドの第2のプログラミング方法NSOperation

4767 ワード

マルチスレッドの最初のプログラミング方法NSThreadを先に紹介したが,今日は2番目のプログラミングNSOperationを紹介する.以下は主に3つの方式で実現する:1、NSInvocationOperationとNSOperationQueueを組み合わせて使用する
pragma mark---NSInvocationOperationとNSOperationQueueを組み合わせたマルチスレッド開発
手順:1、ビュー2の作成、スレッド3の作成、スレッドキュー4の作成、スレッドをスレッドキューに入れる5、サブスレッドにデータ6をロードし、メインスレッド7に戻り、UIを更新する
#import "ViewController.h"
#import "CustomOperation.h"
#define kurl @"http://store.storeimages.cdn-apple.com/8748/as-images.apple.com/is/image/AppleInc/aos/published/images/s/38/s38ga/rdgd/s38ga-rdgd-sel-201601?wid=848&hei=848&fmt=jpeg&qlt=80&op_sharpen=0&resMode=bicub&op_usm=0.5,0.5,0,0&iccEmbed=0&layer=comp&.v=1454777389943"

@interface ViewController ()
{
    UIImageView *imageView;
}
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
//1、    
   imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];
    [self.view addSubview:imageView];

//2、    
   
    NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadResource) object:nil] ;
   
    //3、      
    NSOperationQueue *operationQueue = [NSOperationQueue new];
   
    //4、             
    [operationQueue addOperation:invocationOperation];
     
}

 //5、          
-(void)loadResource{
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl]];
    UIImage *image = [UIImage imageWithData:data];
   
    //6、     
    [[NSOperationQueue mainQueue]addOperationWithBlock:^{
       
        //7、  UI
        imageView.image = image;
       
    }];
}
  • NSBlockOperationとNSOperationQueueを組み合わせて使用:この操作は基本的に第1の方法と同じで、他はあまり言わないので、コードを直接見ましょう.
  • -(void)viewDidLoad{
        [super viewDidLoad];
        
    //    1、      
        imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];
        [self.view addSubview:imageView];
        
    //    2、        
        NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
            
    //    5、      
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl]];
            UIImage *image = [UIImage imageWithData:data];
            
    //        6、     
            [[NSOperationQueue mainQueue]addOperationWithBlock:^{
                      
    //            7、  UI
                imageView.image = image;
                
            }];
            
        }];
    
    //    3、        
        NSOperationQueue *operationQueue = [NSOperationQueue new];
        
    //    4、            
        [operationQueue addOperation:blockOperation];
    }
    

    3、NSOperationを継承するサブクラス(カスタム)はNSOperationQueueと組み合わせて使用し、あるスレッド操作1をカプセル化するのがより便利である.このサブクラスはmainメソッドを書き換える必要があり、mainメソッド内でスレッド操作を行い、そのスレッドが実行されると自動的にmainメソッドを呼び出す
    2).mainメソッド内で、同期操作であれば、プライマリ・スレッドの自動リリース・プールに自動的にアクセスでき、非同期実行操作であれば、プライマリ・スレッドの自動リリース・プールにアクセスできないため、自動リリース・プールを新規作成することを忘れないでください.
    -(void)viewDidLoad{
        [super viewDidLoad];
        
        //    1、      
        imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];
        [self.view addSubview:imageView];
        
    //    2、        ,     main, main        
        CustomOperation *customOperation = [[CustomOperation alloc]initWithImageView:imageView];
        
    //    3、        
        NSOperationQueue *operationQueue = [NSOperationQueue new];
        
    //    4、            
        [operationQueue addOperation:customOperation];
         
    }
    #import "CustomOperation.h"
    
    #define kurl @"http://store.storeimages.cdn-apple.com/8748/as-images.apple.com/is/image/AppleInc/aos/published/images/s/38/s38ga/rdgd/s38ga-rdgd-sel-201601?wid=848&hei=848&fmt=jpeg&qlt=80&op_sharpen=0&resMode=bicub&op_usm=0.5,0.5,0,0&iccEmbed=0&layer=comp&.v=1454777389943"
    @implementation CustomOperation
    - (instancetype)initWithImageView:(UIImageView *)imageView
    {
        self = [super init];
        if (self) {
            self.imageView = imageView;
            
        }
        return self;
    }
    -(void)main{
        
        //           ,                   
        @autoreleasepool {
            
    //        5、        
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl]];
            
            UIImage *image = [UIImage imageWithData:data];
            
    //        6、     
            [[NSOperationQueue mainQueue]addOperationWithBlock:^{
                
    //            7、  UI
                self.imageView.image = image;
                
            }];
            
        }
        
        
    }
    @end
    

    3、NSOperationとNSThreadの違い1」、NSThreadは起動する必要があります.つまり、スレッドのライフサイクルを管理するのに苦労する必要がありますが、NSOperation方式ではスレッドをキューに入れるだけでいいです.スレッドキューは管理を担当し、すべてのスレッド操作を実行します.2)、管理スレッドの最大同時実行数、すなわち同時に実行されるタスク数.3』、スレッド間の依存関係を制御し、NSOperation間で依存を設定して実行順序を保証することができる.4)、キューのキャンセル、一時停止、リカバリ.
    注意:マルチスレッドの3番目のプログラミング方法GCDについて説明します.引き続き注目してください.