2016-04-11 19 views
0

yılında progressView Güncelleştiremiyor. Birkaç yolu test ama başarılı aslaBen bu yöntemi ettik arka planda eylemi gerçekleştirmek ve mainThread


DÜZENLEME 1

Uygulama @Russell önerme, mükemmel, ama dispatch_async bloğunun içinde değerini hesaplayarak daima 0

hangi sonuç çalışmak bir sorun hakkında var mı operasyonlar ve multithread?

yöntemi:

func stepThree() { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     var current = 0 
     var total = 0 
     self.operation = "prDatas" 
     let entries = self.data.componentsSeparatedByString("|***|") 
     total = entries.count 
     for entry in entries { 
      ++current 
      self.registerDB(entry) 
      dispatch_async(dispatch_get_main_queue(), { 
       print("value of 'current' is :" + String(current)) 
       print("value of 'total' is :" + String(total)) 
       print("Result is : " + String(Float(current/total))) 
       self.updateV(Float(current/total)) 
      }) 
     } 
    }) 
} 

Konsol çıkışı:

value of 'current' is :71 
value of 'total' is :1328 
Result is : 0.0 
+1

Float - sonra ve - hesaplama ilk yapılır - tamsayılar ile sonuç (her zaman 0'dır) bir Float'a dönüştürülür. Çözümünde aynı sorunu yaşadım, bu yüzden her iki parametreyi de ilk önce floatlara dönüştürdüm. – Russell

+0

Daha iyi çalışıyor, tekrar teşekkürler! – Khorwin

cevap

1

Kodunuz hemen durum çubuğunu güncelleyecektir - yani iş bitmiş olmaz.

Sen aslında registerDB işlevi izler, böylece güncelleştirmeyi taşımak gerekir ve sonra ana iş parçacığı üzerinde arama yapmak zorundayız. İşte bir örnek - Beklediğim gibi çalıştığını sağlayabilmemiz, bunun yerine işlev çağrılarının kukla işlevleri kullanarak

(akım/toplam) senin sorunun
func stepThree() 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     let total = 5 // test data for demo 
     for entry in 0...total 
     { 
      // dummy function - just pause 
      sleep(1) 
      //self.registerDB(entry) 

      // make UI update on main queue 
      dispatch_async(dispatch_get_main_queue(), 
      { 
       self.setProgress(Float(entry)/Float(total)) 
      }) 
     } 
    }) 
} 

func setProgress(progress : Float) 
{ 
    progressView.progress = progress 
    lblProgress.text = String(format: "%0.2f", progress) 
} 
+0

Bu işe yaramıyor. performSelectorOnMainThread ile çağrılan bir işlevden güncelleme sınandı, şimdi kesme noktaları, işlev iyi zamanda çağrılır, progressView değerini güncelleştirir, ancak görsel olarak değil ... – Khorwin

+0

Yukarıdaki adımı güncelledim. Bir arka plan görevi ve UI'yi içinden güncellemek için ana sıra aramaları yapma. – Russell

+0

Doğru, iyi iş çıkardın! bunun için teşekkürler. İlerleme değerine ilişkin bir sorunla karşılaşıyorum, gönderimi güncelledim. – Khorwin