有没有办法在 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 ;
}