Neden Eş Zamanlılık?
Uygulamanıza veri yükleme gibi ağır görevler eklediğiniz anda, kullanıcı arayüzünüzü yavaşlatır ve hatta dondurur. Eşzamanlılık, 2 veya daha fazla görevi "aynı anda" gerçekleştirmenize olanak tanır. Bu yaklaşımın dezavantajı, kontrol edilmesi her zaman kolay olmayan iplik güvenliğidir. Farklı görevler, aynı değişkeni farklı bir iş parçacığında değiştirmeye çalışmak veya farklı iş parçacıkları tarafından zaten engellenen kaynaklara erişmek gibi aynı kaynaklara erişmek istediğinde.
Farkında olmamız gereken birkaç soyutlama var.
- Kuyruklar.
- Eşzamanlı / Eşzamansız görev performansı.
- Öncelikler.
- Yaygın sorunlar.
Kuyruklar
Olmalı seri veya eşzamanlı . Yanı sıra küresel veya özel aynı anda.
Seri kuyruklarda görevler tek tek, eşzamanlı kuyruklarla bitirilecek, görevler eşzamanlı olarak gerçekleştirilecek ve beklenmedik programlarda bitirilecektir. Aynı görev grubu, eşzamanlı bir kuyruğa kıyasla bir seri kuyrukta daha fazla zaman alacaktır.
Kendi oluşturabilirsiniz özel sıraları (hem seri veya eşzamanlı ) ya da zaten mevcut kullanmak küresel (sistem) sıraları . Ana kuyruk sadece seri kuyruk tüm dışarı küresel kuyruklar .
Ana kuyrukta UI çalışmasına atıfta bulunulmayan ağır görevlerin yerine getirilmemesi (ağdan veri yükleme), bunun yerine UI'nin donmamış ve kullanıcı eylemlerine yanıt vermesini sağlamak için diğer kuyruklarda yapılması şiddetle tavsiye edilir . UI'nin diğer kuyruklarda değiştirilmesine izin verirsek, değişiklikler farklı ve beklenmedik bir program ve hızda yapılabilir. Bazı UI öğeleri, ihtiyaç duyulduktan önce veya sonra çizilebilir. Kullanıcı arayüzünü çökertebilir. Ayrıca beri akılda tutmak gerekir küresel kuyruklar vardır sistem kuyruklar üzerlerinde sistem tarafından çalıştırılabilir diğer bazı görevler vardır.
Hizmet Kalitesi / Öncelik
Kuyruklar ayrıca görev gerçekleştirme önceliğini (burada en yüksekten en düşüğe ) ayarlayan farklı qos'a (Hizmet Kalitesi) sahiptir : .userInteractive - ana kuyruk .userInitiated - kullanıcının bir miktar yanıt beklediği kullanıcı tarafından başlatılan görevler için. Kullanışlılık - görevler için biraz zaman alan ve anında yanıt gerektirmeyen, örneğin , görsel kısımla ilgili olmayan ve tamamlanma süresi için katı olmayan görevler için data .background ile çalışma ). Ayrıca qos bilgilerini aktarmayan .default kuyruğu da vardır . O saptamak mümkün değilse QoS
qos , .userInitiated ve .utility arasında kullanılacaktır .
Görevler eşzamanlı veya eşzamansız olarak gerçekleştirilebilir .
Eşzamanlı işlev, yalnızca görev tamamlandıktan sonra denetimi geçerli kuyruğa döndürür. Sırayı bloke eder ve görev bitene kadar bekler.
Eşzamansız işlev, farklı kuyrukta gerçekleştirilmek üzere görev gönderildikten hemen sonra mevcut kuyruğa denetim döndürür. Görev bitene kadar beklemez. Sırayı engellemez.
Yaygın Sorunlar.
Programcıların eşzamanlı uygulamaları yansıtırken yaptıkları en popüler hatalar şunlardır:
- Yarış koşulu - uygulamanın çalışması kod parçalarının yürütülme sırasına bağlı olduğunda ortaya çıkar.
- Öncelikli ters çevirme - daha yüksek öncelikli görevler, bazı kaynakların engellendiği için daha küçük öncelikli görevlerin tamamlanmasını beklediğinde
- Kilitlenme - birkaç kuyrukta bu kuyruklardan bazıları tarafından zaten engellenen kaynaklar (değişkenler, veriler vb.) İçin sonsuz bekleme olduğunda.
Ana kuyruktaki senkronizasyon işlevini ASLA çağırmayın .
Ana kuyrukta senkronizasyon işlevini çağırırsanız, kuyruğu bloke eder ve ayrıca kuyruk, görevin tamamlanmasını bekler ancak kuyruk nedeniyle başlatılamayacağı için görev asla bitirilmez. zaten engellendi. Kilitlenme denir .
Senkronizasyon ne zaman kullanılır?
Görev bitene kadar beklememiz gerektiğinde. Fe, bazı işlevlerin / yöntemin çift çağrılmadığından emin olduğumuzda. Fe senkronizasyonumuz var ve tamamen bitene kadar çift çağrılmasını engellemeye çalışıyoruz. İşte bu endişe için bazı kodlar:
IOS cihazında hata çökme raporuna neyin neden olduğunu nasıl öğrenebilirim?
DispatchQueue.main.sync
Arka plan iş parçacığından aramak yanlış olur mu?