0

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

- (IBAction) btnGreaterTen_clicked :(id)sender{ 

    self.searchDistance = [NSNumber numberWithDouble : 10]; 

    CGRect frame = CGRectMake (120.0, 185.0, 80, 80); 

    activity = [[UIActivityIndicatorView alloc] initWithFrame: frame]; 
    activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; 


    [navigationUpdateFromDetail.window addSubview: activity]; 


    [activity startAnimating]; 


    thread = [[NSThread alloc] init]; 
    [thread start]; 

[self performSelectorInBackground: @selector (getSetDisplay) withObject:nil];   

if(thread.isFinished == YES){ 
    [activity stopAnimating]; 
} 
} 

Приведенный выше код, который у меня есть, после того, как вы попытались настроить его для достижения конечного результата. Я пытаюсь оживить UIActivityIndicator, пока я использую этот метод getSetDisplay для захвата информации из сети.

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

ответ

4

Вы должны рассмотреть проблему под другим углом: вы должны позволить вашему «основному потоку» продолжать работать, и пусть ваш «вторичный поток» вызывает селектор в основном потоке, когда это делается, выполняя работу ,

Для этого вы должны использовать метод performSelectorOnMainThread и называть его вторичным потоком. Его прототипом является - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait. Вы должны ввести свой «финишный» код в методе, а затем сделать что-то вроде:

[self performSelectorOnMainThread:@selector(doneDoingWork) withObject:nil waitUntilDone:NO]; 
+0

Я пробовал этот метод, но UIActivity от того, что я понимаю, нужно запускать в основном потоке, и ОС помещает его в этот поток. Вот почему я запускаю мой метод на фоне. я просто должен знать, как его контролировать – Makinitez21

+4

Подумайте о том, чтобы положить что-то вроде этого в конце вашего метода getSetDisplay: '[activity performSelectorOnMainThread: @selector (stopAnimating) withObject: nil waitUntilDone: NO]' – Mike

+1

Ваша тема = [ [NSThread alloc] init]; кажется, ничего не делает. Вы создаете там нить, а затем еще один с вызовом performSelectorInBackground. Вышеуказанные комментарии, вероятно, так, как я бы хотел ... Или вы могли бы использовать NSNotifications для сообщения между фоном op и передним планом op. – Hunter

1

Спасибо, ребята. Наконец, я получил решение, которое помогло Майку и его предыдущему комментарию.

- (IBAction) btnGreaterTen_clicked :(id)sender{ 

self.searchDistance = [NSNumber numberWithDouble : 10]; 


[activity startAnimating]; 

NSLog(@" search value after change %@", [searchDistance description]); 

[self performSelectorInBackground: @selector (getSetDisplay) withObject: nil]; 
} 

Я включил индикатор активности с «[Activity startAnimating]», который работает по основному потоку. Затем я начал свой метод в фоновом потоке с помощью «performSelectorInBackground». И в конце моего метода getSetDisplay я разместил следующий оператор.

[activity performSelectorOnMainThread: @selector (stopAnimating) withObject:nil waitUntilDone:NO]; 

Это просто еще один способ сказать [activity stopAnimating], который работает над основной нитью.

Благодарим всех, кто ответил.

Смежные вопросы