7

Eşzamansız iki GCD blok var. İlki arka plan iş parçacığı için, ikincisi ana iş parçacığı üzerinde çalışır. Bu harika çalışıyor, ancak sadece bir yerde konuşarak dispatch_release()'u kullanarak onları serbest bırakmam gerekebileceğini gördüm. MS:dispatch_queue_t dispatch_release() kullanılarak serbest bırakılması gerekiyor mu?

// Use gcd 
dispatch_queue_t queue = dispatch_queue_create("com.awesome", 0); 
dispatch_queue_t main = dispatch_get_main_queue(); 

// do the long running work in bg async queue 
// within that, call to update UI on main thread. 
dispatch_async(queue, ^{ 
    // Do work in the background 



    // Release 
    dispatch_release(queue); 

    dispatch_async(main, ^{ 

     // Main 


     // Release 
     dispatch_release(main); 

    });//end 
});//end 

Bu doğru mu? Onları burada serbest bırakmalı mıyım?

+0

Başlık dosyasındaki yorumlarda, oluşturduğunuz herhangi bir sırada dispatch_release() yöntemini çağırmanız gerekir. – BonanzaDriver

cevap

8

Yalnızca oluşturduğunuz sıraları serbest bırakın; Ana sırayı ya da küresel eşzamanlı kuyrukları serbest bırakmayın (ya da, yine, kendiniz oluşturmadıysanız). ne zaman sonra

queue = dispatch_queue_create(...) 
dispatch_async(queue, ^{ something; dispatch_release(queue); }); 
dispatch_async(queue, ^{ something else}); // CRASH! 

Çalışmaz: yanlış kapsamda yapıyor ve bu, çünkü aynı zamanda yaptığınızı olarak iş blok içinde açıklaması, bu sırasına kuyruğa yuva için iyi bir fikir değil 2. dispatch_async()'u eklemek için kodu değiştirin. Oluşturma/yayınlama çağrılarınızı her zaman aynı kapsamda eşleştirerek, yapabileceğinizi varsayarak, daha iyi bir stilistik seçimdir.

+0

Tamam, sadece dispatch_asynch çağrısının dışında bırakmam gerekiyor mu? –

+0

Evet. Spesifik olarak, daha sonra bir adım attığınız, daha sonra adım attığınız bir arazi mayınını belirttiğiniz, çağrı oluşturma ile aynı kapsamda yapmalısınız (bu kuralın tek istisnası finalizörler olabilir, fakat şeyler karıştırmayın :)) – jkh

13

Yalnızca dispatch_queue_create ile oluşturulan sırayı serbest bırakmanız gerekir. Ana sıra her zaman var olacak ve onu serbest bırakmak mantıklı değil.

Sıraya eklenen tüm bloklar, sıranın kendisini koruyacaktır, böylece dispatch_async aramanızdan sonra dispatch_release(queue) numaralı telefonu güvenle arayabilirsiniz. Burada yazdığınız kodun ardından bloğun dışında bunu yapmak için en iyisi.

+0

Tamam, ancak kuyruğu dışında yaparsam, otomatik olarak serbest bırakılmayacak mı? –

+2

@NicHubbard Tüm kuyruğun işi bittiğinde serbest bırakılır, örneğin bir sıra oluşturabilir, 3 - 4 blok gönderebilir ve gönderim çağrılarından sonra serbest bırakabilirsiniz. Tüm bloklar karşılık gelen görevleri tamamlayana kadar sıra korunur. Bu noktada artık bu sıraya ihtiyacınız yok. – Pochi

İlgili konular