從我的主線程我請使用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
(BTW dataReady只是處理數據這不是這種方法,阻止...。)
編輯:我剛剛發現,我不是要求在主線程的選擇。我從一個單獨的線程調用它!不幸的是,我必須從該線程調用它。
看看http://stackoverflow.com/questions/7676508/nstask-blocking-the-main-thread,你的方法似乎在這種情況下工作。 – Damien
請在您的應用程序的示例中,其主線程被阻止並編輯您的問題以包含主線程的堆棧跟蹤。 –