あなたの質問には、必要な要素がすべて揃っています。スレッドを開始し、runloop で実行します。何かを行うためにスレッドが必要な場合はperformSelector:onThread:
、メインスレッドで使用できます。
ただし、runloop には、注意しなければならないことが 1 つあります。それは、入力ソースまたはタイマーが接続されていない限り、実行されないということです。遠い将来のある時点で起動する実行ループにタイマーを接続するだけで、準備は完了です。
// Initialization code here
[NSTimer scheduledTimerWithTimeInterval: FLT_MAX
target: self selector: @selector(doNothing:)
userInfo: nil repeats:YES];
NSRunLoop *rl = [NSRunLoop currentRunLoop];
do {
[rl runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!done);
を使用performSelector:onThread:withObject:
すると、ブロックをバックグラウンド スレッドに渡すこともできます。必要なのは、ブロックをパラメーターとして取り、それを実行するメソッドをどこかに記述することだけです。
@interface NSThread (sendBlockToBackground)
- (void) performBlock: (void (^)())block;
@end
@implementation NSThread (sendBlockToBackground)
- (void) performBlock: (void (^)())block;
{
[self performSelector: @selector(runBlock:)
onThread: self withObject: block waitUntilDone: NO];
}
- (void) runBlock: (void (^)())block;
{
block();
}
@end
しかし、これらすべての代わりにディスパッチ キューを使用する必要があるかもしれません。これにより必要なコードが少なくなり、おそらくオーバーヘッドも少なくなります。
dispatch_queue_t myQueue = dispatch_queue_create( "net.example.product.queue", NULL );
dispatch_async( myQueue, ^{
// Initialization code here
} );
// Submit block:
dispatch_async( myQueue, ^{
[someObject someMethod: someParameter];
} );
を使用して作成されたディスパッチ キューdispatch_queue_create
は、シリアル キューです。送信されたすべてのブロックは、到着した順序で次々と実行されます。