Закройте NSOpenPanel, как только файл / каталог будет выбран - PullRequest
3 голосов
/ 14 января 2011

Я новичок в 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 Ответ

1 голос
/ 14 января 2011

Два примечания:

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

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

...