Soru İOS'ta çoklu iş parçacığıyla ilgili yardım?


OpenEars ve Flite kütüphanesini kullanan bir uygulamam var. Sorun, Flite kütüphanesinin kaynak yoğun olması ve uygulamamı dondurması. Flite'ı bir arka plan iş parçasında çalıştırmanın bazı şeyleri düzelteceğinden şüpheleniyorum ama benim yok hayır fikir nasıl yapılır.

Bahsedilen, iOS'ta nasıl bir arka plan iş parçacığı uygularım??

Birisi bana bazı öğreticiler için işaret edebilir, bazı örnek kodları paylaşabilir veya bu sorunu çözmeme yardımcı olacak herhangi bir genel tavsiyede bulunabilir.


25
2017-12-05 19:05


Menşei


OpenEars'ın flite kütüphanesini kuyruklar veya iplikler aracılığıyla düzenleyebildiniz mi? - Rasman
@Rasman - Denemedim, dürüst, gerçekten meşguldü. Başka bir projede çoklu okuma üzerinde çalışıyorum, bu yüzden yakında tekrar ziyaret edebilirim. - Moshe
tamam, bir takip olarak, sadece benim app gönderim kuyrukları ile inşa ve şimdilik iyi çalışıyor gibi görünüyor. Beklediğimden daha kolaydı. - Rasman


Cevaplar:


Eşzamanlılık Programlama Kılavuzu Apple tarafından güzel bir okuma. Eşzamanlı programlama, web'den bazı örnek kodları kopyalayıp mutlu oluncaya kadar hacklemeyi tercih edebileceğiniz bir şey değildir. Kendinizi sıkıntıdan kurtarmak için seçenekleri ve ilkeleri bilmek güzel.


Bir süre sonra cevabı tekrar gözden geçirerek, bugünlerde Grand Central Dispatch kullanarak neredeyse yanlış gidemezsiniz. Arka planda bir görevin yürütülmesi şu şekilde görünür:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self doSomeLongTask]; // 1
    dispatch_async(dispatch_get_main_queue(), ^{
        [self longTaskDidFinish]; // 2
    });
});

Uzun görev (1), bazı arka plan iş parçacığı üzerinde çalışır ve farkında olduğum hiçbir yakalama, yani. Bu iş parçacığında zaten bir otomatikleştirme havuzu var, çalıştırma döngülerine dikkat etmeniz gerekmez. Görev tamamlandıktan sonra kod çağrıları tamamlanır. -longTaskDidFinish Ana parçacığa (2), böylece kullanıcı arayüzünü veya başka herhangi bir şeyi güncelleyebilirsiniz. Bu sık kullanılan bir deyimdir.


45
2017-12-05 19:08



Zoul'un söylediği; iş parçacığı zor. Kodunuz çalışırken çalışırken görünse bile, hala çok yanlış olabilir. - bbum
Bu iş parçasına doSOmeLongTask yönteminden nasıl erişebilirim? Mesela gönderdiğiniz postaları beğeniyorum. ve benim metodumun içinde "doSomeLongTask" Bu iş parçacığı sonunda bazı şeyler yapmak gerekir - Shial
Ne olurdu [self.longTaskDidFinish]. Sonundaki uygulamamda doSomeLongTask Bir butona basılabileceğini göstermek için bir değişkeni değiştiriyorum. Değişkeni değiştirir miyim [self longTaskDidFinish] yaptıktan hemen sonra değiştirmek yerine [self doSomeLongTask] - Roymunson


Belki de yapılacak en iyi şey Apple'dan bu eğitici. Tüm uygulamamı dikkatli bir şekilde (10-20 dakika) ve “iş parçacığı” okudum! Mükemmel!


6
2018-03-03 02:54





Swift 3

DispatchQueue.global(qos: .userInteractive).async {
    // Code to run on background thread

    // Switch to the main UI thread to display any results needed
    DispatchQueue.main.async {
        // Run code on main UI thread here
    }
}

qos parametresi "Hizmet Kalitesi" anlamına gelir. Arka plan iş parçanızı vermek için bir öncelik gibi düşünün:

  • .userInteractive (en yüksek öncelik)
  • .userInitiated (birkaç saniyenizi ayırabileceğiniz zaman)
  • .utility (birkaç saniyeden birkaç dakikaya yedekleyebileceğiniz zaman)
  • .background (en düşük öncelik - yedeklenecek dakika / saat)

1
2018-03-16 12:41