我刚刚遇到NSOperation的一个奇怪的行为,我已修复但不明白。
我按照文档继承了NSOperation。当我使用下面的main方法时,应用程序将使用100%或更多的CPU时间。
-(void)main
{
@try
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
//Cycle forever until told to cancel
while (![self isCancelled])
{
}
[pool release];
}
@catch(...)
{
// Do not rethrow exceptions.
}
//Finish executing
[self completeOperation]; //Send notificatios using KVO
}
相反,当我使用以下主方法时,应用程序使用3%的CPU时间。
-(void)main
{
@try
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
//Create the initial delayed timers
NSTimer *startUpTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:startUpTimer forMode:NSRunLoopCommonModes];
[runLoop run];
//Cycle forever until told to cancel
while (![self isCancelled])
{
}
[pool release];
}
@catch(...)
{
// Do not rethrow exceptions.
}
//Finish executing
[self completeOperation]; //Send notificatios using KVO
}
这种奇怪的行为似乎归因于计时器。如果要求计时器不重复,则应用程序使用100%CPU时间,但如果要求计时器重复,则CPU使用率正常。
看来当线程上没有运行时,CPU使用率非常高(我认为它会相反)。为什么会出现这种情况的任何建议?
感谢。
答案 0 :(得分:14)
循环while循环将占用CPU的单个核心的100%。这就是循环所做的事情,无论是否在队列中。
答案 1 :(得分:0)
截至iPhone equivalent of Application.DoEvents();
添加
while (![self isCancelled])
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]]
}
看看情况如何。