4

请看这段代码:

@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在分离的线程中工作?

4

1 回答 1

4

由于您在不同的线程中运行function:选择器,[NSRunLoop currentRunLoop]因此与主线程中的不同。

请参阅NSRunLoop 参考

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

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

解决您的问题的一个简单方法是

@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

实际上,您可能会将记录“AFTER”的代码放入计时器调用的新方法中。一般来说,你不需要线程来做动画(除非你在做一些计算成本很高的事情)。如果您正在做计算成本高昂的工作,您还应该考虑使用 Grand Central Dispatch (GCD),它可以简化后台线程上的卸载计算并为您处理管道。

于 2012-03-22T10:01:36.933 回答