如何让NSRunLoop在一个单独的线程中工作?

时间:2012-03-22 09:55:26

标签: iphone objective-c nsthread nsrunloop

请看这段代码:

@interface myObject:NSObject

-(void)function:(id)param;

@end

@implementation myObject

-(void)function:(id)param
{
    NSLog(@"BEFORE");
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:20]];
    NSLog(@"AFTER");
}

@end


int main(int argc, char *argv[])
{
    myObject *object = [[myObject alloc] init];

    [NSThread detachNewThreadSelector:@selector(function:) toTarget:object withObject:nil];

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

调用function方法但暂停时间不超过20秒。我该怎么做才能使NSRunLoop在分离的线程中工作?

1 个答案:

答案 0 :(得分:4)

由于您在另一个线程中运行function:选择器,[NSRunLoop currentRunLoop]与主线程中的@implementation myObject -(void)function:(id)param { NSLog(@"BEFORE"); [[NSRunLoop currentRunLoop] addTimer:[NSTimer timerWithTimeInterval:20 selector:... repeats:NO] forMode:NSDefaultRunLoopMode]; [[NSRunLoop currentRunLoop] run]; NSLog(@"AFTER"); } @end 不同。

请参阅NSRunLoop reference

  

如果没有输入源或定时器附加到运行循环,则此方法立即退出

我猜你的运行循环是空的,因此" BEFORE"和"之后"日志会立即出现。

解决问题的简单方法是

{{1}}

实际上,您可能会将记录的代码放在" AFTER"在您的计时器调用的新方法中。通常,您不需要线程来制作动画(除非您正在做一些计算上昂贵的事情)。如果你正在做计算上昂贵的东西,你还应该考虑使用Grand Central Dispatch(GCD),它简化了后台线程的卸载计算,并将为你处理管道。