长时间延迟后,NSRunLoop正在调用我的选择器

时间:2012-05-14 04:44:31

标签: iphone objective-c ios macos nsrunloop

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

    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可能处于不同的模式。

有没有办法让资金以最高优先级执行,即在runloop中执行的任何内容都会被中断或类似的事情。

2 个答案:

答案 0 :(得分:0)

您可以创建NSTimer并将fireate设置为now。请参阅下面的示例代码。

  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];

答案 1 :(得分:0)

我正在回答我自己的问题。我的runloop在NSInputStream上等待:当没有要读取的字节时读取。所以func正在runloop源中排队,但是当线程在socket上等待时,没有任何东西被执行。

当我连接runloop并看到它卡在那里时,我知道了这一点。