Вызовите метод делегата в фоновом режиме - PullRequest
2 голосов
/ 01 сентября 2010

это мой первый вопрос здесь, так что извините, если я допустил какие-либо ошибки!

В моем проекте iPhone у меня есть метод, запущенный в потоке, выполнение которого занимает много времени (поэтому он выполняется в потоке).

[NSThread detachNewThreadSelector:@selector(methodToBeCalledInAThread) toTarget:self withObject:nil];

// ...

-(void)methodToBeCalledInAThread {  
    MyClass *myClass = [[MyClass alloc] init];  
    [myClass setDelegate:self]; 
    [myClass veryIntensiveComputing];   
    [myClass release];
}

Моя цель - уведомить ViewController, вызывающий этот метод, о любом прогрессе, происходящем в этом методе. Вот почему я установил ViewController как делегат класса.

Теперь в дорогом методе я делаю следующее:

if(self.delegate != nil) {
    [self.delegate madeSomeProgress];
}

Но, к сожалению, это не работает, потому что (я думаю) я в фоновой ветке.

Как мне добиться уведомления делегата о любых изменениях метода, выполняемого асинхронно?

1 Ответ

4 голосов
/ 01 сентября 2010

Попробуйте [self.delegate performSelectorOnMainThread: @selector(madeSomeProgress) withObject: nil waitUntilDone: YES]; ....

Подробнее см. В документации .

Это синхронно выполнит операцию на главномнить.Пока Ничего в основном потоке не пытается выполнить вещи в этом вторичном потоке, это в основном безопасно.

Однако , если вы не хотитеблокировать вычисления, пока основной поток не обработает запрос, вы можете передать NO, чтобы не ждать.Если вы это сделаете, то вам также придется беспокоиться о синхронизации потоков.Основной поток может не сразу обслуживать запрос, и, если это так, ваш фоновый поток может находиться в состоянии мутирования.

Потоки трудные.

...