Закройте NSOpenPanel, как только файл / каталог будет выбран

Я новичок в NSOpenPanel/NSSavePanel/NSPanel. Я использую NSOpenPanel, чтобы выбрать каталог, файлы которого мое приложение будет перебирать и выполнять довольно трудоемкую обработку.

Я могу вызвать -close на панели, но это не возвращает фокус в главное окно. Я много читал об "отклонении" панели, но я не нашел никаких методов, которые бы "отклоняли", а не "закрывали" панель или окно.

Это просто, что мне нужно порождать фоновый поток (NSOperation)?

Это то, что мой -chooseDidEnd: returnCode: contextInfo:

-(void) chooseDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
    {
    [panel orderOut:self];
    [panel release];

    if (returnCode == NSFileHandlingPanelOKButton)
        {
        [progressIndicator startAnimation:self];
        [self doLotsOfTimeConsumingWork:[[panel URL] path]];
        [progressIndicator stopAnimation:self];
        }
    }

Несмотря на то, что NSOpenPanel действительно исчезает, мой NSProgressIndicator не анимируется, и главное окно не оживает до тех пор, пока -doLotsOfTimeConsumingWork: не завершится.

Обновление Только что посмотрел на код NSOperationSample, и похоже, что это путь.

1 ответ

Решение

Две заметки:

Во-первых, в Какао обработка событий и отрисовка происходят в основном потоке. Следовательно, никогда не стоит синхронно вызывать длинные методы (что является причиной вашего неотзывчивого интерфейса).
Так что да, вы должны передать вычислительно дорогостоящие задачи вторичному потоку из этого метода, как из любого IBAction,

Во-вторых, звоня [panel release] в этом методе нарушаются правила владения объектом Какао! Поэтому, если вы будете пропускать панель без этого вызова, вы должны исправить это в методе, в котором вы создаете панель.

Другие вопросы по тегам