[iOS]バックグラウンドワークキュー:NSOperationQueue、NSOperation、NSInvocationOperation


NSOperationQueue
1,operationQueueに複数のoperationを同時に追加できるのではないでしょうか.
はい、もともとoperationQueueの目的はマルチスレッド管理ですが、そのマルチスレッドは、1つのスレッドだけではありません.
このキューが処理されるたびに「アクション」の数を設定できます.
	NSOperationQueue *aQ = [[NSOperationQueue alloc] init];
	[aQ setMaxConcurrentOperationCount:10];

ここのsetMaxConcurrentOperationCountは同時に処理される「操作数」であり、パラメータは整数intまたはNSInteger(2つは同じで、覚えていないのは私のブログで検索してもいいですよ~)
2、main関数はどう書けばいいですか.
main関数には、別のプロセスでやるべきことを書くだけです.例えば私にとって、私はいつも簡単なことをしているだけで、NSInvocationOperation、NSOperationの簡略化版を使います.たとえば、
NSInvocationOperation *aOpt = [[NSInvocationOperation alloc]
		 initWithTarget:self selector:@selector(doSomeThing) object:nil];
 
- (void)doSomeThing
{
    //           
    //    performSelectorOnMainThread             
}

doSomeThing関数では、ネット上から何かを読み取ることができますが、読み取りには時間がかかり、メインスレッドが詰まっています.NSOperationを使うと使えなくなります.
NSOperationであれば、少し複雑ですが、NSOperationのサブクラスを作ります.実はmain関数がやっていることはdoSomeThingと同じです.ただし、このサブクラスを作成すると、その操作の内容がより多くなり、より複雑な読み取り、読み込み操作などを作成することができ、このクラスの機能を繰り返し使用することができます.また、NSOperationはruntime操作のサポートも提供していますが、それは面倒で、一般的にはあまり使いません.
NSOperation
マルチスレッドプログラミングは、プライマリスレッドの詰まりを防止し、実行効率を向上させるなどの最適な方法です.元のマルチスレッド法には,スレッドロック死など多くの欠点がある.CocoaではAppleがNSOperationというクラスを提供し,優れたマルチスレッドプログラミング方法を提供している.
今回はNSOperationの使い方を説明します.
1は、別のスレッドで作業を個別にクラス化し、親をNSOperationに設定します.
@interface ImageLoadingOperation : NSOperation {
    NSURL *imageURL; //                ,      NSURL  
    id target; //         ,                   (         )
    SEL action; //           
}

2、その初期化方法によって必要なパラメータとオブジェクトが入力される
- (id)initWithImageURL:(NSURL *)theImageURL target:(id)theTarget action:(SEL)theAction
{
    self = [super init]; //                 
    if (self) {
        imageURL = [theImageURL retain]; //      , retain(   ?    )
        target = theTarget;
        action = theAction;
    }
    return self;
}

このクラスオブジェクトを呼び出すとき、必要なパラメータとオブジェクトを入力します.
//                 
ImageLoadingOperation *operation = [[ImageLoadingOperation alloc] initWithImageURL:url target:self action:@selector(didFinishLoadingImageWithResult:)];  //   
[operationQueue addOperation:operation]; //       
[operation release];  //      retain,      release 

3,我々のスレッド操作クラスにおけるmain関数実行に必要な作業
- (void)main
{
    //       
    NSData *data = [[NSData alloc] initWithContentsOfURL:imageURL];
    UIImage *image = [[UIImage alloc] initWithData:data];
 
    //           ,          
    NSDictionary *result = [NSDictionary dictionaryWithObjectsAndKeys:image, ImageResultKey, imageURL, URLResultKey, nil];
    [target performSelectorOnMainThread:action withObject:result waitUntilDone:NO];
 
    [data release]; //       
    [image release];
}

これらは簡単なNSOperationの使用過程です.実は見て、とても簡単で、アップルが私たちのために用意してくれた他のAPIのようです!
NSInvocationOperation
マルチスレッドプログラミングは、プライマリスレッドの詰まりを防止し、実行効率を向上させるなどの最適な方法です.元のマルチスレッド法には,スレッドロック死など多くの欠点がある.CocoaではAppleがNSOperationというクラスを提供し,優れたマルチスレッドプログラミング方法を提供している.
今回はNSOperationのサブセット、簡易メソッドのNSInvocationOperationを紹介します.
@implementation MyCustomClass
 
- (void)launchTaskWithData:(id)data
{
    //    NSInvocationOperation  ,       
    //   ,selector                     (  ,Method)
    //   ,object               
    NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
                    selector:@selector(myTaskMethod:) object:data];
 
    //           “Operation”             (            )
    //              “  ”  
    [[MyAppDelegate sharedOperationQueue] addOperation:theOp];
}
 
//                “  ”
- (void)myTaskMethod:(id)data
{
    // Perform the task.
}
 
@end

NSOperationQueueオペレーションキューは、スレッドではなくスレッドマネージャに相当します.このスレッドマネージャ内で並列に実行できるスレッドの数などを設定できるからです.次に、オペレーションキューを作成して初期化します.
@interface MyViewController : UIViewController {
 
    NSOperationQueue *operationQueue;
    //          
}
@end
 
@implementation MyViewController
 
- (id)init
{
    self = [super init];
    if (self) {
        operationQueue = [[NSOperationQueue alloc] init]; //       
        [operationQueue setMaxConcurrentOperationCount:1];
        //                  
        //           
    }
    return self;
}
 
- (void)dealloc
{
    [operationQueue release];
    //  Alan    ,         ,      !
    [super dealloc];
}
 
@end

簡単に紹介すると、実はこの方法はとても簡単であることがわかります.多くの場合、マルチスレッドを使用するのはメインスレッドの詰まりを防ぐためだけで、NSInvocationOperationは最も簡単なマルチスレッドプログラミングであり、iPhoneプログラミングでよく使われています.