Ответ 1
У вас есть все необходимые части в вашем вопросе. Вы начинаете свой поток и запускаете его 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
, является последовательной очередью - все отправленные на нее блоки будут выполняться в том же порядке, в каком они были получены, один за другим.