Какао НАСТОЯЩЕЕ МЕДЛЕННОЕ NSTextView. Есть ли лучший способ добавить текст к содержимому NSTextView?

Я очень новичок в Cocoa, и это, вероятно, полный вопрос новичка. Однако я до смерти разочарован.

У меня есть чрезвычайно простое приложение Cocoa (называемое «строками») для проверки отправки 1000 строк текста в текстовое представление.

Я начал в Xcode 4 с «нового проекта Какао» со всеми значениями по умолчанию. Это дает пустой объект окна, на который я могу перетащить элементы пользовательского интерфейса IB.

Пользовательский интерфейс, который я затем сконструировал, состоит из текстового представления и кнопки в окне файла NIB. Я использую Xcode 4, чтобы перетащить эти два элемента в файл .h. Текстовое представление подключено к outView , а кнопка «1000» подключена к методу one_thousand_button .

The UI

Нажатие кнопки «1000» запускает цикл для печати 1000 строк текста («строка 1 \ n» «строка 2 \ n» ... «строка 1000») в NSTextView под названием «outView»

Здесь - это весь код (кроме описанного файла .XIB):

строкAppDelegate.h:

#import <Cocoa/Cocoa.h>

@interface linesAppDelegate : NSObject <NSApplicationDelegate> {
@private
    NSWindow *window;
    NSTextView *outView;
}

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTextView *outView;
- (IBAction)one_thousand_button:(id)sender;

@end

строкAppDelegate.m:

#import "linesAppDelegate.h"

@implementation linesAppDelegate

@synthesize window;
@synthesize outView;

- (IBAction)one_thousand_button:(id)sender {
    NSString* oldString;
    NSString* newString;

    for(int i=1; i<=1000; i++){
        oldString = [outView string];
        newString = [oldString stringByAppendingString: 
                     [NSString stringWithFormat: @"Line %i\n",i]];
        [outView setString: newString];    
    }
}
@end

Это ДЕЙСТВИТЕЛЬНО МЕДЛЕННО выполняется. Возможно, 7 секунд в первый раз и все медленнее с каждым нажатием «1000».Даже есть крутящаяся красочная пицца смерти!

Я понимаю, что это, вероятно, неправильный способ заполнить NSTextView 1000 строк текста и что цикл, который считывает содержимое текстового представления и добавляет его с помощью метода stringByAppendingString , является узким местом.

Каков же альтернативный метод?

Результат

Я обернул этот код:

    mach_timebase_info_data_t info;
    mach_timebase_info(&info);
    uint64_t start = mach_absolute_time();

// timed code    

    uint64_t duration = mach_absolute_time() - start;
    duration *= info.numer;
    duration /= info.denom;
    duration /= 1000000;

    NSLog(@"timed code took %lld milliseconds!", duration);

вокруг кода из Адама Пребла , моего оригинала, и drewk :

                 Adam Preble  (Adam, base)     drewk    my pitiful code
 1st run:           3ms          269ms         260ms      1,950ms
 2nd run            3ms          269ms         250ms      2,332ms
 3rd run:           2ms          270ms         260ms      2,880ms

При первом запуске добавляется 1000 строк; 2-й прогон добавляет еще 1000 строк и т. Д. (Адам, база) - это его код без beginEditing и endEditing

Понятно, что использование beginEditing и endEditing НАМНОГО быстрее!

См. Документы Apple по Синхронизация редактирования .

6
задан Community 23 May 2017 в 12:31
поделиться