2012-06-11 16 views
39

Bazı daha uzun işlemlerinde (ayrıştırma, ağ bağlantıları vb.) Birden çok iş parçacığına sahip olması gereken orta derecede karmaşık bir iOS programı yazıyorum. Ancak, farkın dispatch_get_global_queue ve dispatch_queue_create arasında olduğu konusunda kafam karıştı.dispatch_get_global_queue ve dispatch_queue_create arasındaki fark nedir?

biri kullanmalıyım ve bana fark genel olarak ne olduğu, basit bir açıklama verebilir

? Teşekkürler.

+1

Ya .. u yanlış cevap aldı. Robert Ryan cevabı daha uygun –

cevap

68

documentation açıklandığı gibi, bir genel sıra eşzamanlı görevler için iyidir (örneğin eşzamansız olarak çeşitli görevleri gönderirsiniz ve eşzamanlı olarak çalışırlarsa çok mutlu olurlar) ve teorik sorunlarla karşılaşmak istemiyorsanız kendi sıranızı yaratma ve yok etme yükü.

kendi kuyruğunun oluşturma Bir seri kuyruğu gerekirse çok yararlıdır (yani oturum sevk bloklar teker teker yürütülecek gerekir). Bu, her bir görevin öncekine bağlı olduğu veya birden fazla iş parçacığı tarafından paylaşılan bazı kaynaklarla etkileşimin koordine edildiği durumlarda, birçok senaryoda yararlı olabilir.

az yaygın, ancak eşzamanlı kuyrukta birlikte barriers kullanmanız gerekiyorsa siz de kendi kuyruğunu oluşturmak isteyecektir. Bu senaryoda, eşzamanlı bir kuyruk oluşturun (DISPATCH_QUEUE_CONCURRENT seçeneği ile dispatch_queue_create) ve bu sırayla birlikte engelleri kullanın. Küresel kuyruklarda asla engel kullanmamalısınız. sonra bir sıra oluşturmak, bir seri sıra ihtiyaç (ya da engelleri kullanmaya gerek) eğer

Benim genel danışmanı olduğunu. Eğer yapmazsanız, devam edip global sırayı kullanın ve kendi yarattığınız yükü atlayın. Bir eşzamanlı kuyruğu istiyorum, ancak birçok operasyonlar aynı anda çalıştırabilirsiniz nasıl kontrol etmek isterseniz


, ayrıca bir maxConcurrentOperationCount özelliğine sahiptir NSOperationQueue kullanarak düşünebilirsiniz. Bu, ağ işlemleri yaparken yararlı olabilir ve sunucunuza gönderilmek üzere çok fazla eş zamanlı istek istemezsiniz.

+2

Ancak, Aslan'da 'DISPATCH_QUEUE_CONCURRENT' komutunu kullanarak' dispatch_queue_create() 'adından eşzamanlı bir sıra almak mümkün olsa da. Bunun mevcut küresel sıralardan birini döndürüp döndürmeyeceği belirtilmemiş (ve muhtemelen önemli değil). –

+1

"Eninde sonunda iOS için işlevselliğin geleceğini" eklemeliydim. –

+1

Eşzamanlı ve seri sıralar arasındaki farkları doğru bir şekilde işaret etmek için aşağıya çekildi. – user523234

0

Bir başka yenisini oluşturur, mevcut küresel kuyruğu döndürür. GCD kullanmak yerine NSOperation ve operasyon kuyruğunu kullanmayı düşünebilirim. Bu konuda daha fazla bilgi bulabilirsiniz in this guide. Tipik olarak, işlemlerin eşzamanlı olarak yürütülmesini istiyorsanız, kendi kuyruğunu oluşturmak ve işlemlerinizi ona koymak istiyorsunuz.

+0

Sadece açıklamak gerekirse, bir gönderi sırası oluşturuyorsanız, bu seridir. Global gönderim sırasını kullanıyorsanız, eşzamanlı olabilir (ancak böyle olması garanti edilemez). Danışmanlığınızın eşzamanlılık için kuyruk oluşturduğunu varsayalım, kuyruk kuyrukları değil, operasyon kuyruğuyla ilgilidir. (Bunu bildiğini biliyorum, ama sadece okuyucuların kafasının karışmamasını sağlamak istedim.) – Rob

+1

Evet, operasyon kuyruklarından bahsediyorum. Aynı problemle bir süre önce karşılaşıyordum ve herhangi bir başka konfigürasyon olmaksızın kendi operasyon sırasını oluşturduğumda, buna eklenen operasyonlar aynı anda yürütüldü. –

40

Sadece farklı bir cevap göndermiş, ama burada ben geri oldukça zaman yazdım şeydir:

ilk çok düşük seviyede, sadece iki türü vardır olduğunu fark etmektir sıraları conceptualize iyi yolu kuyruklar: seri ve eşzamanlı. Seri kuyruklar tek eşliliğe sahip, ancak unexpmitted. Her seri sıraya bir sürü görev verirseniz, her seferinde yalnızca bir iş parçacığı kullanarak bunları teker teker çalıştıracaktır. Karşılaşılmayan yön, seri kuyrukların görevleri arasında farklı bir iş parçacığına geçebilmesidir. Seri kuyruklar her zaman bir göreve geçmeden önce bitirmek için beklerler. Böylece görevler FIFO düzeninde tamamlanır. dispatch_queue_create ile istediğiniz kadar çok sayıda sıralayabilirsiniz.

ana kuyruk özel seri kuyruk olduğunu. Diğer seri kuyruklar, hangi uncommitted, onlar "bir sürü iş parçacığı" ancak tek bir anda "," ana kuyruk, ana iş parçacığı için "evli" ve tüm görevler üzerinde gerçekleştirilir.Ana sıradaki işler, runloop ile iyi bir şekilde davranmalıdır, böylece küçük operasyonlar UI'yi ve diğer önemli bitleri engellemez. Tüm seri kuyruklar gibi, görevler FIFO siparişinde tamamlanır.

Seri sıralar tek eşliyse, eşzamanlı kuyrukları birbirinin aynısıdır. Sistem yüküne bağlı olarak, herhangi bir iş parçacığına görev gönderecek veya yeni iş parçacıkları oluşturacaklardır. Farklı iş parçacıklarında aynı anda birden çok görevi gerçekleştirebilirler. Global sıraya gönderilen görevlerin iplik güvenli olması ve yan etkileri en aza indirmesi önemlidir. Görevler FIFO emrinde yürütülür, ancak tamamlanma sırası garanti edilmez. Bu yazıdan sonra, sadece üç eşzamanlı kuyruk var ve bunları yapamazsınız, sadece dispatch_get_global_queue ile getirebilirsiniz.

düzenleme: Bu yanıta genişleyen blog yayını: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

+2

En İyi. Cevap. Hiç. –

+1

Blog yayını bağlantısı kesildi. –

+0

Hala benim için çalışıyor gibi görünüyor. Son zamanlarda blog motorlarını güncelledim, bu yüzden burada yeni bir kanonik adres var: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html – amattn

İlgili konular