22

所以我正在启动一个新的 NSThread,我希望以后可以通过调用performSelector:onThread:.... 根据我对调用该方法的理解,该方法将该调用添加到该线程上的 runloop,因此在其下一次迭代中,它将弹出所有这些调用并随后调用它们,直到没有任何东西可以调用。所以我需要这种功能,一个准备好工作的空闲线程,我可以调用它。我当前的代码如下所示:

   - (void)doInitialize
   {
       mThread =  [[NSThread alloc] initWithTarget:self selector:@selector(runThread) object:nil];
       [mthread start];
   }

   - (void)runThread
   {
       NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];

       // From what I understand from the Google machine is that this call should start the
       // runloop on this thread, but it DOESN'T. The thread dies and is un-callable
       [[NSRunLoop currentRunLoop] run];

       [pool drain];
   }

   - (void)scheduleSomethingOnThread
   {
       [self performSelector:@selector(hardWork) onThread:mThread withObject:nil waitUntilDone:NO];
   }

但是线程没有保持活动状态,并且 performSelector:onThread 不做任何事情。我该如何以正确的方式解决这个问题?

4

2 回答 2

15

运行循环至少需要一个“输入源”才能运行。主运行循环可以,但您必须手动添加源才能获得辅助运行循环的-run方法来执行任何操作。这里有一些关于此的文档。

让这个工作的一种天真的方法就是放入[[NSRunLoop currentRunLoop] run]一个无限循环。当有事要做时,它会做,否则立即返回。问题是线程将花费相当多的处理器时间来等待某些事情发生。

另一种解决方案是在此运行循环上安装一个 NSTimer 以使其保持活动状态。

但是,如果可能的话,你应该使用为这类事情设计的机制。如果可能,您可能希望NSOperationQueue用于后台操作。

于 2011-06-08T01:06:13.190 回答
10

这段代码应该强制线程永远等待

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; // adding some input source, that is required for runLoop to runing
while (shouldKeepRunning && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); // starting infinite loop which can be stopped by changing the shouldKeepRunning's value
于 2013-02-25T16:34:29.113 回答