Başından beri Swift, ObjC ve C'yi daha Swifty yapmak için bazı olanaklar sağladı ve her versiyona daha fazlasını ekledi. Şimdi, Swift 3'te, yeni "üye olarak içe aktar" özelliği, bir sınıf gibi çalışan bir veri türüne ve onunla çalışmak için bir grup küresel işleve sahip olan belirli C API stilleriyle çerçevelere izin verir - daha çok Swift-yerli API'leri gibi davranır. Veri türleri Swift sınıfları olarak içe aktarılır, ilgili küresel işlevleri bu sınıflar üzerinde yöntem ve özellikler olarak içe aktarılır ve sabitler gibi bazı ilgili şeyler uygun olduğunda alt türler haline gelebilir.
Xcode 8 / Swift 3 beta sürümünde Apple, Dispatch çerçevesini çok daha Swifty yapmak için bu özelliği (birkaç diğerleri ile birlikte) uyguladı. (Ve Core Graphics de.) Swift açık kaynak çabalarını izliyorsanız, bu bir haber değil , ama şimdi Xcode'un ilk kez bir parçası.
Herhangi bir projeyi Swift 3'e taşımak için ilk adımınız Xcode 8'de açmak ve menüde Düzen> Dönüştür> Geçerli Swift Sözdizimine ... 'i seçmek olmalıdır . Bu, yeniden adlandırılan tüm API'lar ve diğer değişiklikler için gereken değişiklikleri (inceleme ve onayınızla birlikte) bir kerede uygulayacaktır. (Çoğu zaman, bir kod satırı bu değişikliklerin birden fazlasından aynı anda etkilenir, bu nedenle hata düzeltmesine tek tek yanıt vermek her şeyi doğru işlemeyebilir.)
Sonuç olarak, işi arka plana ve geriye sıçramak için ortak desen şu şekilde görünür:
// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.imageView.image = image
}
}
.userInitiated
Eski DISPATCH_QUEUE_PRIORITY
sabitlerden biri yerine kullandığımızı unutmayın . Hizmet Kalitesi (QoS) belirleyicileri, OS X 10.10 / iOS 8.0'da tanıtıldı ve sistemin çalışmaya öncelik vermesi ve eski öncelik belirteçlerini kaldırması için daha net bir yol sağladı. Ayrıntılar için Apple'ın arka plan çalışması ve enerji verimliliği dokümanlarına bakın.
Bu arada, işi düzenlemek için kendi kuyruklarınızı tutuyorsanız, bir tane almanın yolu şu şekilde görünür (bunun DispatchQueueAttributes
bir olduğuna dikkat edin OptionSet
, böylece seçenekleri birleştirmek için koleksiyon stili değişmezleri kullanırsınız):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Daha dispatch_after
sonra çalışmak için mi kullanıyorsunuz? Bu da kuyruklarda bir yöntemdir ve DispatchTime
çeşitli sayısal türler için işleçlere sahip bir a alır , böylece tam veya kesirli saniye ekleyebilirsiniz:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Arayüzünü Xcode 8'de açarak yeni Dispatch API'sinde yolunuzu bulabilirsiniz - Dispatch modülünü bulmak için Hızlı Aç'ı kullanın veya DispatchQueue
Swift projenize / oyun alanınıza bir sembol (gibi ) koyun ve komuta tıklayıp brouse yapın oradan modül. (Swift Dağıtım API'sını Apple'ın gösterişli yeni API Referansı web sitesinde ve X-kodu doküman görüntüleyicide bulabilirsiniz, ancak C sürümündeki doküman içeriği henüz buraya taşınmamış gibi görünüyor.)
Daha fazla ipucu için Taşıma Kılavuzu'na bakın .