作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
请看这段代码:
@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
在分离线程中工作?
最佳答案
由于您在不同的线程中运行 function:
选择器,因此 [NSRunLoop currentRunLoop]
与主线程中的不同。
请参阅NSRunLoop reference :
If no input sources or timers are attached to the run loop, this method exits immediately
我猜你的运行循环是空的,因此“BEFORE”和“AFTER”日志会立即出现。
您的问题的一个简单解决方案是
@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),它可以简化后台线程的卸载计算并为您处理管道。
关于iphone - 如何让 NSRunLoop 在一个单独的线程中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9819872/
我是一名优秀的程序员,十分优秀!