您的问题中包含所有必要的部分。你启动你的线程并让它运行它的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
是一个串行队列 - 发送到它的所有块将按照它们到达的相同顺序执行,一个接一个。