2009-12-04 10 views

Odpowiedz

16

Jeśli piszesz kod tak:?

- (void) doStuff 
{ 
    [activityIndicator startAnimating]; 
    ...lots of computation... 
    [activityIndicator stopAnimating]; 
} 

Nie jesteś dając czas UI rzeczywiście uruchomić i zatrzymać wskaźnik aktywności, ponieważ wszystkie twoje obliczenia znajdują się w głównym wątku. Jednym z rozwiązań jest wywołanie startAnimating w osobnym wątku:

- (void) threadStartAnimating:(id)data { 
    [activityIndicator startAnimating]; 
} 

- (void)doStuff 
{ 
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil]; 
    ...lots of computation... 
    [activityIndicator stopAnimating]; 
} 

Albo można umieścić swoje obliczenia na osobnym wątku, i czekać na to, aby zakończyć przed wywołaniem stopAnimation.

+1

Thx za rozwiązanie! Czy ten sam problem .. (+1) – Prine

+0

czy ta metoda uruchamia nowy wątek ... ??? jeśli tak, to gdzie i jak to zatrzymać? –

+0

Wielkie dzięki za rozwiązanie .. pomaga mi wyjść .. – Shivaay

12

zwykle zrobić:

[activityIndicator startAnimating]; 
[self performSelector:@selector(lotsOfComputation) withObject:nil afterDelay:0.01]; 

... 

- (void)lotsOfComputation { 
    ... 
    [activityIndicator stopAnimating]; 
} 
+0

Ta droga dobrze dla mnie działała. – Arash

+0

Robię to samo, z tą różnicą, że używam - (void) performBlock: (void (^) (void)) blok po Opóźnienie: (NSTimeInterval) opóźnienie; z http://forrst.com/posts/Delayed_Blocks_in_Objective_C-0Fn Gdy podaję 0,0, nie wyświetla się wskaźnik postępu, a 0,01 to czas pomiędzy błyskami monitora 100 Hz. – 18446744073709551615

+0

Dzięki za rozwiązanie ... –

0

Ok, przepraszam, zdaje się, jakbym przeszedł mój kod jest ślepa.

Mam zakończył wskaźnik tak:

[activityIndicator removeFromSuperview]; 
activityIndicator = nil; 

Więc po jednej perspektywie activityIndicator został całkowicie usunięty.

0

To pytanie jest bardzo przydatne. Ale jedna rzecz, której nie ma w odpowiedziach, to: wszystko, co zajmuje dużo czasu, musi być wykonane w osobnym wątku, a nie w UIcticIndicatorView. W ten sposób nie przestanie reagować na interfejs UI.

- (void) doLotsOFWork:(id)data { 
    // do the work here. 
} 

    -(void)doStuff{ 
    [activityIndicator startAnimating]; 
    [NSThread detachNewThreadSelector:@selector(doLotsOFWork:) toTarget:self withObject:nil]; 
    [activityIndicator stopAnimating]; 
} 
+0

Poszedłbym z tym. To najlepsze wytłumaczenie. Jedną z poprawek jest jednak przeniesienie wywołania, aby zatrzymać animację wskaźnika w metodzie, którą oddzieliłeś. Zatrzyma animację po zakończeniu metody. –

1

Wszystkie elementy interfejsu użytkownika wymaga się na głównym wątku

[self performSelectorOnMainThread:@selector(startIndicator) withObject:nil waitUntilDone:NO]; 

następnie:

-(void)startIndicator{ 
    [activityIndicator startAnimating]; 
} 
1

razie potrzeby szybkiej 3 wersję:

func doSomething() { 
    activityIndicator.startAnimating() 
    DispatchQueue.global(qos: .background).async { 
     //do some processing intensive stuff 
     DispatchQueue.main.async { 
      self.activityIndicator.stopAnimating() 
     } 
    } 
} 
Powiązane problemy