进程通信 NSPipe

今天研究 NSLog 效率问题的时候发现一个有意思的类 NSPipe,用来进程间通信,没用过,资料也很少。

原理很简单呀,就是一根管道(队列),一端写,一端读,通过这种方式达到进程间通信的目的。网上有个实际使用的例子,将iOS的IO标准输出重定向到我们自己管道,然后我们就可以捕获NSLog和print这些标准输出了。

可以用来把log打在自己的文件中,感觉有点黑科技,实不实用得看情况了。

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- (void)fileHandleReadCompletionNotification:(NSNotification *)notification {
NSData *logData = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
NSString *logString = [[NSString alloc] initWithData:logData encoding:NSUTF8StringEncoding];
/*logString可以输出在你喜欢的地方,但是这里面不能再调用标准输出了*/
[[notification object] readInBackgroundAndNotify];
}
- (void)redirectSTD:(int)fileDescriptor {
NSPipe *pipe = [NSPipe pipe] ;
NSFileHandle *pipeReadHandle = [pipe fileHandleForReading] ;
dup2([[pipe fileHandleForWriting] fileDescriptor], fileDescriptor) ;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(fileHandleReadCompletionNotification:)
name:NSFileHandleReadCompletionNotification
object:pipeReadHandle];
[pipeReadHandle readInBackgroundAndNotify];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self redirectSTD:STDOUT_FILENO];
[self redirectSTD:STDERR_FILENO];
return YES;
}

参考:

iOS IO 重定向(NSLog to UITextView)

iOS日志获取和实时浏览器显示日志


iOS Objective-C pipe thread 进程间通信