2

问题陈述:我们有一个辅助线程,我们在其中进行所有后端处理。在这个辅助线程中,我们创建了一个单独的 NSRunLoop 来运行。我们在这个运行循环中创建和使用计时器

    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
NSRunLoop * threadRL = [NSRunLoop currentRunLoop];
[threadRL addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[threadRL run];
[myPool release];

除了对选择器的调用需要将近 10 秒的时间来执行之外,每件事都运行良好,而且这种情况并非每次都随机发生。

[myclass performSelector:@selector(func) onThread:myThread withObject:nil waitUntilDone:NO];

我也试过了,没有区别。

[myclass performSelector:@selector(func) onThread:myThread withObject:nil waitUntilDone:NO modes:[NSArray arrayWithObjects: NSDefaultRunLoopMode, NSRunLoopCommonModes,nil]];

我没有在 func 中做任何可能需要这么多时间的任务,

我在想的是,runloop 可能处于不同的模式。

有没有办法让资金以最高优先级执行,即在运行循环中执行的内容被中断或类似的东西。

4

2 回答 2

0

您可以创建一个 NSTimer 并将 firedate 设置为现在。请参阅下面的示例代码。

  NSTimer *timer = [[NSTimer alloc] initWithFireDate:now
                                                  interval:.01
                                                    target:myClass
                                                  selector:@selector(funct)
                                                  userInfo:nil
                                                   repeats:NO];

   NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
        [runLoop run];
于 2012-05-14T11:08:16.920 回答
0

我正在回答我自己的问题。当没有字节可读取时,我的运行循环正在等待 NSInputStream:read 。所以 func 在 runloop 源中排队,但是由于线程正在等待套接字读取,所以没有执行任何操作。

当我挂钩运行循环并看到它卡在那里时,我知道了这一点。

于 2012-05-15T12:36:15.443 回答