Sejak awal, Swift telah menyediakan beberapa fasilitas untuk membuat ObjC dan C lebih cepat, menambahkan lebih banyak pada setiap versi. Sekarang, di Swift 3, "impor sebagai anggota" baru memungkinkan kerangka kerja dengan gaya tertentu dari C API - di mana Anda memiliki tipe data yang berfungsi seperti kelas, dan banyak fungsi global untuk bekerja dengannya - bertindak lebih seperti API Swift-asli. Jenis data yang diimpor sebagai kelas Swift, fungsi global terkaitnya mengimpor sebagai metode dan properti pada kelas tersebut, dan beberapa hal terkait seperti set konstanta dapat menjadi subtipe yang sesuai.
Dalam Xcode 8 / Swift 3 beta, Apple telah menerapkan fitur ini (bersama beberapa lainnya) untuk membuat kerangka Pengiriman jauh lebih cepat. (Dan Core Graphics , juga.) Jika Anda telah mengikuti upaya open-source Swift, ini bukan berita , tapi sekarang adalah pertama kalinya itu bagian dari Xcode.
Langkah pertama Anda untuk memindahkan proyek apa pun ke Swift 3 adalah dengan membukanya di Xcode 8 dan pilih Edit> Convert> To Current Swift Syntax ... di menu. Ini akan berlaku (dengan ulasan dan persetujuan Anda) semua perubahan sekaligus yang diperlukan untuk semua API yang diubah namanya dan perubahan lainnya. (Seringkali, satu baris kode dipengaruhi oleh lebih dari satu perubahan ini sekaligus, jadi menanggapi kesalahan perbaikan-nya secara individual mungkin tidak menangani semuanya dengan benar.)
Hasilnya adalah bahwa pola umum untuk memantulkan pekerjaan ke latar belakang dan kembali sekarang terlihat seperti ini:
// 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
}
}
Perhatikan bahwa kami menggunakan .userInitiated
alih-alih salah satu DISPATCH_QUEUE_PRIORITY
konstanta lama . Penentu Kualitas Layanan (QoS) diperkenalkan di OS X 10.10 / iOS 8.0, memberikan cara yang lebih jelas bagi sistem untuk memprioritaskan pekerjaan dan mencabut penentu prioritas lama. Lihat dokumen Apple tentang pekerjaan latar belakang dan efisiensi energi untuk detailnya.
Omong-omong, jika Anda menyimpan antrian sendiri untuk mengatur pekerjaan, cara mendapatkannya sekarang terlihat seperti ini (perhatikan bahwa itu DispatchQueueAttributes
adalah OptionSet
, jadi Anda menggunakan literal gaya koleksi untuk menggabungkan opsi):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Menggunakan dispatch_after
untuk melakukan pekerjaan nanti? Itu adalah metode antrian juga, dan dibutuhkan DispatchTime
, yang memiliki operator untuk berbagai jenis numerik sehingga Anda bisa menambahkan detik keseluruhan atau fraksional:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Anda dapat menemukan jalan di sekitar API Pengiriman baru dengan membuka antarmuka di Xcode 8 - gunakan Buka dengan Cepat untuk menemukan modul Pengiriman, atau letakkan simbol (seperti DispatchQueue
) di proyek / taman bermain Swift Anda dan klik perintah, kemudian cari-cari di sekitar modul dari sana. (Anda dapat menemukan Swift Dispatch API di situs web Referensi API baru yang cerdik di Apple dan penampil dokumen dalam-Xcode, tetapi sepertinya konten dokumen dari versi C belum masuk ke dalamnya.)
Lihat Panduan Migrasi untuk tips lainnya.