2009-12-04 23 views
8

Bir UIActivityIndicatorView üzerinde başlatarak başladığımda, başlatılamıyor. Bu neden?iPhone UIActivityIndicatorBaşlarken veya durmuyor Görünüm

[Bu bir blog stili kendiliğinden yanıtlanmış bir sorudur. Aşağıdaki çözüm belki daha iyi diğerleri var, benim için çalışıyor, ama]

+0

Sen yapmak isteyebilirsiniz Bir blog tarzı kendi kendine cevaplanmış bir soru gönderiyorsunuz. Çözüm için – TechZen

cevap

16

böyle bir kod yazarsanız: Aslında başlatmak ve durdurmak için UI süre vererek değil

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

Faaliyet göstergesi, çünkü tüm hesaplamanız ana iş parçacığı üzerindedir. Eğer ayrı bir iş parçacığı üzerinde hesaplama koymak ve bu stopAnimation çağırmadan önce bitirmesini beklemek,

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

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

Veya: Tek çözüm ayrı bir konu startAnimating aramak.

+1

Thx! Aynı sorun vardı ... (+1) – Prine

+0

bu yöntem yeni bir iş parçacığı başlatır .. ??? eğer evet o zaman nerede ve nasıl durdurulur .. ?? –

+0

Çözüm için çok teşekkürler ... bana yardımcı olur .. – Shivaay

12

Genellikle yapın: Benim kod kör olmak geçti gibi

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

... 

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

Bu yol benim için iyi çalıştı. – Arash

+0

Ben aynı şeyi yapıyorum - (void) performBlock: (void (^) (void)) block afterDelay: (NSTimeInterval) gecikme kullandığım farkla; http://forrst.com/posts/Delayed_Blocks_in_Objective_C-0Fn 0.0'ı belirttiğimde, hiçbir ilerleme göstergesi gösterilmez ve 0.01, 100Hz'lik bir monitörün yanıp sönmesi arasındaki zamandır. – 18446744073709551615

+0

Çözüm için teşekkürler ... –

0

Tamam, özür görünüyor.

böyle Göstergesi bitirdiler:

[activityIndicator removeFromSuperview]; 
activityIndicator = nil; 

Yani bir çalışmanın ardından, activityIndicator tamamen kaldırılmıştır.

0

Bu soru oldukça kullanışlıdır. Ancak, yanıt postasında eksik olan bir şey, uzun süren her şeyin UIActivityIndicatorView değil, ayrı iş parçacığında gerçekleştirilmesi gerekir. Bu şekilde UI arayüzüne yanıt vermeyecek.

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

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

Ben bununla giderdim. Dışarıdaki en iyi açıklama. Bir düzeltme olsa da, siz ayrıldığınız yöntemde göstergeyi hareketlendirmeyi durdurmak için çağrıyı hareket ettiririm. Yöntem tamamlandıktan sonra animasyonu durduracaktır. –

1

Tüm UI öğeleri

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

sonra ana iş parçacığı üzerinde olmasını gerektiren: Gerekirse

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

, hızlı 3 versiyon:

func doSomething() { 
    activityIndicator.startAnimating() 
    DispatchQueue.global(qos: .background).async { 
     //do some processing intensive stuff 
     DispatchQueue.main.async { 
      self.activityIndicator.stopAnimating() 
     } 
    } 
} 
İlgili konular