Di Swift 2, saya dapat membuat antrian dengan kode berikut:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Tapi ini tidak dikompilasi di Swift 3.
Apa cara yang disukai untuk menulis ini di Swift 3?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Karthik Kumar
sumber
sumber
DispatchQueue(label: "your-label")
untuk antrian serial. Params tambahan semua memiliki nilai default.Jawaban:
Membuat antrian bersamaan
Buat antrian serial
Dapatkan antrian utama secara tidak sinkron
Dapatkan antrian utama secara sinkron
Untuk mendapatkan salah satu utas latar belakang
Xcode 8.2 beta 2:
Untuk mendapatkan salah satu utas latar belakang
Jika Anda ingin belajar tentang menggunakan antrian ini. Lihat jawaban ini
sumber
attributes: .serial
saat membuat antrian serial:let serialQueue = DispatchQueue(label: "queuename")
.Kompilasi di bawah> = Swift 3 . Contoh ini mengandung sebagian besar sintaks yang kita butuhkan.
QoS - kualitas baru sintaksis layanan
weak self
- Mengganggu mempertahankan siklusjika diri tidak tersedia, jangan lakukan apa pun
async global utility queue
- untuk permintaan jaringan, tidak menunggu hasilnya, itu adalah antrian bersamaan, blok (biasanya) tidak menunggu ketika dimulai. Pengecualian untuk antrian konkuren bisa, ketika batas tugasnya telah tercapai sebelumnya, maka antrian sementara berubah menjadi antrian serial dan menunggu sampai beberapa tugas sebelumnya dalam antrian itu selesai.async main queue
- untuk menyentuh UI, blok tidak menunggu hasilnya, tetapi menunggu slotnya di awal. Antrian utama adalah antrian serial.Tentu saja, Anda perlu menambahkan beberapa pengecekan kesalahan pada ...
sumber
guard
yangself
tidaknil
di atas, sehingga tidak ada kode dijalankan jika itunil
, misalnya,guard strongSelf = self else { return }
..global(qos: .background)
untuk IO (permintaan jaringan). Gunakan.global(qos: .default)
atau.global(qos: .utility)
sebagai gantinya.Dikompilasi dalam XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
sumber
Karena pertanyaan OP sudah dijawab di atas, saya hanya ingin menambahkan beberapa pertimbangan kecepatan:
Itu membuat banyak perbedaan apa kelas prioritas yang Anda tetapkan untuk fungsi async Anda di DispatchQueue.global .
Saya tidak merekomendasikan menjalankan tugas dengan prioritas .background thread terutama pada iPhone X di mana tugas tersebut tampaknya dialokasikan pada core berdaya rendah.
Berikut adalah beberapa data nyata dari fungsi intensif komputasi yang membaca dari file XML (dengan buffering) dan melakukan interpolasi data:
Nama perangkat / .background / .utility / .default / .userInitiated / .userInteractive
Perhatikan bahwa kumpulan data tidak sama untuk semua perangkat. Ini yang terbesar di iPhone X dan yang terkecil di iPhone 5s.
sumber
Saya melakukan ini dan ini sangat penting jika Anda ingin menyegarkan UI Anda untuk menampilkan data baru tanpa memperhatikan pengguna seperti di UITableView atau UIPickerView.
sumber
// gunakan Operation Queue jika Anda perlu mengisi objek (label, imageview, textview) pada viewcontroller Anda
sumber
Saya mengerjakan ulang kode Anda di Xcode 8, Swift 3 dan perubahannya ditandai berbeda dengan versi Swift 2 Anda.
sumber
Cepat 3
Anda ingin memanggil beberapa penutupan dalam kode cepat maka Anda ingin mengubah di storyboard ya semua jenis perubahan milik tampilan aplikasi Anda akan crash
tetapi Anda ingin menggunakan metode pengiriman aplikasi Anda tidak akan crash
metode async
metode sinkronisasi
sumber
DispatchQueue.main.sync
Antrian serial:
Antrian bersamaan:
sumber
Untuk Swift 3
sumber
sumber
Perbarui untuk cepat 5
Dari dokumentasi Apple :
Parameter
label
Label string untuk dilampirkan ke antrian untuk mengidentifikasi secara unik di alat debugging seperti Instrumen, sampel, stackshots, dan laporan kerusakan. Karena aplikasi, perpustakaan, dan kerangka kerja semuanya dapat membuat antrian pengiriman sendiri, gaya penamaan DNS-terbalik (com.example.myqueue) direkomendasikan. Parameter ini opsional dan bisa NULL.
qos
Tingkat kualitas layanan untuk dikaitkan dengan antrian. Nilai ini menentukan prioritas di mana sistem menjadwalkan tugas untuk dieksekusi. Untuk daftar nilai yang mungkin, lihat DispatchQoS.QoSClass.
atribut
Atribut untuk dikaitkan dengan antrian. Sertakan atribut konkuren untuk membuat antrian pengiriman yang menjalankan tugas secara bersamaan. Jika Anda menghilangkan atribut itu, antrian pengiriman menjalankan tugas secara seri.
autoreleaseFrequency
Frekuensi untuk melakukan autorelease objek yang dibuat oleh blok yang dijadwalkan antrian. Untuk daftar nilai yang mungkin, lihat DispatchQueue.AutoreleaseFrequency .
target
Antrean target untuk menjalankan blok. Tentukan DISPATCH_TARGET_QUEUE_DEFAULT jika Anda ingin sistem memberikan antrian yang sesuai untuk objek saat ini.
sumber
itu sekarang hanya:
default adalah serial, untuk mendapatkan bersamaan, Anda menggunakan argumen atribut opsional .concurrent
sumber
seiralQueue.async {}
. @tylemolsumber
Anda dapat membuat antrian pengiriman menggunakan kode ini di swift 3.0
sumber