Multithreading NSTask遇到大数据时阻止我的UI
我想用生成nstask executionIpa期间生成的数据更新我的nstextview。但是当我运行我的代码来执行NSTASK时,在中间,我的NSTASK阻止了我的UI,但是任务继续执行。最后,当nstask终止时,我的ui开始正常工作 这是我运行nstask的代码:Multithreading NSTask遇到大数据时阻止我的UI,multithreading,user-interface,blocking,nstask,large-data,Multithreading,User Interface,Blocking,Nstask,Large Data,我想用生成nstask executionIpa期间生成的数据更新我的nstextview。但是当我运行我的代码来执行NSTASK时,在中间,我的NSTASK阻止了我的UI,但是任务继续执行。最后,当nstask终止时,我的ui开始正常工作 这是我运行nstask的代码: dispatch_queue_t taskQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); NSTask *task=[[
dispatch_queue_t taskQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
NSTask *task=[[NSTask alloc]init];
dispatch_async(taskQueue, ^{
@try {
[task setArguments:arguments];
[task setLaunchPath: launchPath];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskCompletion:) name: NSTaskDidTerminateNotification object:task];
// Output Handling
NSPipe *outputPipe = [[NSPipe alloc] init];
outputFileHandle = [[NSFileHandle alloc]init];
[task setStandardOutput:outputPipe];
outputFileHandle=[outputPipe fileHandleForReading];
[outputFileHandle waitForDataInBackgroundAndNotify];
[[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification object:outputFileHandle queue:nil usingBlock:^(NSNotification *notification){
NSData *output = [outputFileHandle availableData];
NSString *outStr = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding];
dispatch_sync(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskCompletion:) name: NSTaskDidTerminateNotification object:task];
NSLog(@"%@",outStr);
NSString *textViewData =[self.outputView string];
self.outputView.string = [textViewData stringByAppendingString:[NSString stringWithFormat:@"\n%@", outStr]];
// Scroll to end of outputText field
NSRange range;
range = NSMakeRange([self.outputView.string length], 0);
[self.outputView scrollRangeToVisible:range];
});
[outputFileHandle waitForDataInBackgroundAndNotify];
}];
[task launch];
[task waitUntilExit];
}
@catch (NSException *exception) {
NSLog(@"Problem Running Task: %@", [exception description]);
}
@finally {
NSLog(@"i m in finally xbuild");
}
});
我真的很坚持。你的建议对我会有帮助的