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

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

最佳答案

由于您在不同的线程中运行 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/

相关文章:

iphone - 这是制作指南针的方法吗?

objective-c - 在Objective-C中定时和重复执行线程

javascript - 在 iPhone 上使用 Google Chrome 下载 ICS 文件

iphone - 获取objective-c中for语句中的数组索引

c++ - 如何在 iPhone 项目中使用 Boost uBLAS C++ 库?

ios - 长按“开关控制”按钮返回主菜单

iphone - 如何使用新数据重新加载或刷新选项卡栏 Controller 的选项卡栏中的数据?

带有 url startswith 的 iOS webview

ios - iOS 上的 NSThread 编号?

ios - 蓝牙通信 NSStream 是否应该需要一个单独的线程?