objective-c - NSTask 阻塞主线程

标签 objective-c multithreading cocoa nsthread nstask

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

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

相关文章:

iphone - NSDictionary错误处理

objective-c - 将 .NET JSON 日期转换为 NSDate (Swift)

iphone - NSString 编码问题

objective-c - Swift 将未初始化的对象传递给 block

objective-c - 如何找出NSEvent点击事件来自mouseClick或trackpad Click?

c# - 如何将许多不同的线程放入 wait() 并能够使用 signalAll() 唤醒它们?

c# - 我要对其进行字符串搜索的 4000 个文件

c++ - 将 std::mutex 用于由 boost::asio 管理的线程池

objective-c - 当应用程序未激活时如何观察键盘输入事件

objective-c - NSToolbar 中的 NSPopUpButton 太烦人了