NSOperationについて


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操作のサポートも提供していますが、それは面倒で、一般的にはあまり使いません.最近面倒な事が本当に多すぎて、その上すべて顺调ではありませんて、死ぬ心はすべてあります.こんなにたくさんの良い友达が私を支持してくれて、私のこのブログも少しの返事がありました...みんなはそんなに冷ややかではありませんて、私が书いたのが良いか悪いかにかかわらず、东北语で言えば“ギシギシ”ですね~ああ、私は顽张ります!私はまだそんなにたくさんのことができなかったのに,どうしてあきらめることができようか.くそっ!!!あ!!!!!
ラベル:NSInvocationOperation,NSOperation,NSOperationQueue
分類目次:10-性能調整、Cocoa開発、Q&A、iPhone開発  |  5つのコメント
マルチスレッドNSOperation
2009年06月17日、7:18午後
Tマルチスレッドプログラミングは,主スレッドの詰まりを防止し,実行効率を向上させるなどの最良の方法である.元のマルチスレッド法には,スレッドロック死など多くの欠点がある.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のようです!
ラベル:NSOperation,NSOperationQueue,マルチスレッド
分類目次:10-性能調整、Cocoa開発、iPhone開発  |  3つのコメント
マルチスレッドNSInvocationOperation
2009年06月16日、12:27午後
Tマルチスレッドプログラミングは,主スレッドの詰まりを防止し,実行効率を向上させるなどの最良の方法である.元のマルチスレッド法には,スレッドロック死など多くの欠点がある.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プログラミングでよく使われています.