有没有办法在 swift 中拦截标准输出?
Is there a way to intercept stdout in swift?
我想拦截我的 swift 项目中的日志输出。例如,重定向到 UITextView。
我已经尝试了 here 建议的一般方法,但似乎无法正常工作(见下文)。
编辑:我想利用的日志来自我正在使用的静态库。
这是我的 objective-c 代码:
UITextView *scrollview;
int stdoutwrite(void *inFD, const char *buffer, int size) {
NSString *tmp = [NSString stringWithCString:buffer length:size] ; // choose the best encoding for your app
scrollview.text = NSString stringWithFormat:@"%@\n%@", scrollview.text, tmp];
return size ;
}
void redirectlog(UITextView *debugview) {
scrollview = debugview;
stdout->_write = stdoutwrite;
}
我正在从我的视图控制器调用 redirectlog
。
这是我收到的错误:
Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /SourceCache/UIFoundation/UIFoundation-376.14/UIFoundation/TextSystem/NSLayoutManager_Private.m:1547
2015-09-20 21:07:08.256 [380:84529] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'
错误信息很清楚。您只能在主线程中更新文本视图。一种简单的方法是使用 dispatch_async
.
将其分派到主线程
int stdoutwrite(void *inFD, const char *buffer, int size) {
NSString *tmp = [NSString stringWithCString:buffer length:size] ; // choose the best encoding for your app
dispatch_async(dispatch_get_main_queue(), ^{
scrollview.text = NSString stringWithFormat:@"%@\n%@", scrollview.text, tmp];
});
return size ;
}
我想拦截我的 swift 项目中的日志输出。例如,重定向到 UITextView。
我已经尝试了 here 建议的一般方法,但似乎无法正常工作(见下文)。
编辑:我想利用的日志来自我正在使用的静态库。
这是我的 objective-c 代码:
UITextView *scrollview;
int stdoutwrite(void *inFD, const char *buffer, int size) {
NSString *tmp = [NSString stringWithCString:buffer length:size] ; // choose the best encoding for your app
scrollview.text = NSString stringWithFormat:@"%@\n%@", scrollview.text, tmp];
return size ;
}
void redirectlog(UITextView *debugview) {
scrollview = debugview;
stdout->_write = stdoutwrite;
}
我正在从我的视图控制器调用 redirectlog
。
这是我收到的错误:
Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /SourceCache/UIFoundation/UIFoundation-376.14/UIFoundation/TextSystem/NSLayoutManager_Private.m:1547
2015-09-20 21:07:08.256 [380:84529] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'
错误信息很清楚。您只能在主线程中更新文本视图。一种简单的方法是使用 dispatch_async
.
int stdoutwrite(void *inFD, const char *buffer, int size) {
NSString *tmp = [NSString stringWithCString:buffer length:size] ; // choose the best encoding for your app
dispatch_async(dispatch_get_main_queue(), ^{
scrollview.text = NSString stringWithFormat:@"%@\n%@", scrollview.text, tmp];
});
return size ;
}