请看这段代码:
@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
在分离的线程中工作?
答案 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
不同。
如果没有输入源或定时器附加到运行循环,则此方法立即退出
我猜你的运行循环是空的,因此" BEFORE"和"之后"日志会立即出现。
解决问题的简单方法是
{{1}}
实际上,您可能会将记录的代码放在" AFTER"在您的计时器调用的新方法中。通常,您不需要线程来制作动画(除非您正在做一些计算上昂贵的事情)。如果你正在做计算上昂贵的东西,你还应该考虑使用Grand Central Dispatch(GCD),它简化了后台线程的卸载计算,并将为你处理管道。