Как использовать NSTextView в качестве консоли журнала из потока? - PullRequest
2 голосов
/ 16 декабря 2011

Я запускаю другой поток обработки, и я хотел бы записать результаты в NSTextView , чтобы при публикации новой строки он обновлял представление и располагал полосу прокрутки вниз. Есть предложения?

- (void)runProc
{
    do {
        [NSThread sleepForTimeInterval:0.1];
        [self reportInfo:@"tick"];
    } while (stop == NO);    
}

- (void)report:(NSString*)string;
{
    [[consoleView textStorage] beginEditing];
    [[[consoleView textStorage] mutableString] appendString:string];
    [[[consoleView textStorage] mutableString] appendString:@"\n"];
    [[consoleView textStorage] endEditing];

    NSRange range;
    range = NSMakeRange ([[consoleView string] length], 0);

    [consoleView scrollRangeToVisible: range];
}

Получается около 50 записей, затем все блокируется.

1 Ответ

5 голосов
/ 21 декабря 2011

Большая часть AppKit не является поточно-ориентированной, вы не можете обновить NSTextView из вторичной нити. Все обновления пользовательского интерфейса должны выполняться в главном потоке.

Вам необходимо вызвать метод отчетности следующим образом:

[self performSelectorOnMainThread:@selector(report:) withObject:@"tick" waitUntilDone:YES];
...