gpt4 book ai didi

objective-c - NSTask 阻塞主线程

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:00 25 4
gpt4 key购买 nike

从我的主线程我调用一个选择器使用

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

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