从我的主线程我调用一个选择器使用
[self performSelectorInBackground:@selector(startTask) withObject:nil];
这是方法 startTask:
-(void)startTask{
NSTask *task = [[NSTask alloc] init];
NSPipe *pipe = [[NSPipe alloc] init];
NSFileHandle *fh = [pipe fileHandleForReading];
NSArray *args = [NSArray arrayWithObjects:@"-z",iPAddress, [NSString stringWithFormat:@"%@",portNumber], nil];
[task setLaunchPath:@"/usr/bin/nc"];
[task setArguments:args];
[task setStandardOutput:pipe];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self];
[nc addObserver:self
selector:@selector(dataReady:)
name:NSFileHandleReadCompletionNotification
object:fh];
[task launch];
[fh readInBackgroundAndNotify];
}
这应该可以防止 NSTask 阻塞主线程(和 UI)。但事实并非如此。 如果我删除
[task launch];
主线程不会被阻塞。我究竟做错了什么? o_O
(顺便说一下,dataReady 只是处理数据。不是这个方法,它会阻塞...)
编辑: 我刚刚发现,我不是从主线程调用选择器。我从一个单独的线程调用它!不幸的是,我必须从那个线程调用它。
最佳答案
我不知道这是否是您问题的答案,但您确实有一个基本问题:
readInBackgroundAndNotify 的文档说:
You must call this method from a thread that has an active run loop.
你没有这样做是因为 startTask
在它自己的线程上并且你没有在它上面运行运行循环。
关于objective-c - NSTask 阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296959/