gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:08 24 4
gpt4 key购买 nike

请看这段代码:

@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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com