NSOperationでマルチスレッド処理
NSOperationでマルチスレッド処理を構築する場合、
NSOperationのサブクラスを作成しその中のmainで処理を実装することになる。
作成したoperationをNSOperationQueueにaddOperationして実行する。
もう少し簡単に実装する場合NSBlockOperationやNSInvocationOperationが使える。
名前の通りNSBlockOperationは処理の内容をblockで記述しoperationとして登録する。
NSInvocationOperationは@selectorで処理対象メソッドを指定しoperationに登録する。
#import <Foundation/Foundation.h>
@interface InvocationTest : NSObject
-(void)test;
@end
@implementation InvocationTest
-(void)test
{
sleep(1);
NSLog(@"invocation\n");
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"start\n");
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSOperation *op1 =
[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"block\n");
}];
[queue addOperation:op1]; // blockオペレーション追加
InvocationTest *test = [[InvocationTest alloc]init];
NSOperation *op2 =
[[NSInvocationOperation alloc]initWithTarget:test
selector:@selector(test)
object:nil];
[queue addOperation:op2]; // invocationオペレーション追加
NSLog(@"end\n");
[queue waitUntilAllOperationsAreFinished];
}
return 0;
}