У вас есть все необходимые части вместе в вашем вопросе.Вы запускаете поток и запускаете его runloop.Если вам нужен поток, чтобы сделать что-то, вы можете использовать performSelector:onThread:
в главном потоке, чтобы сделать это.
Есть одна вещь с runloop, которую вы должны знать, хотя: она не будет работать, если она не имеетисточник входного сигнала или таймер подключен к нему.Просто подключите таймер к циклу выполнения, который срабатывает некоторое время в далеком будущем, и все готово.
// 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
, является последовательной очередью - все отправленные ей блоки будут выполняться в том же порядке, в котором они поступили, один задругой.