Bagaimana cara menggunakan threading dalam cepat?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
ios
swift
multithreading
dispatch-queue
Anshul
sumber
sumber
]
sebelum titik koma di baris terakhir?DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
Jawaban:
Swift 3.0+
Banyak yang telah dimodernisasi di Swift 3.0. Menjalankan sesuatu di utas latar belakang terlihat seperti ini:
Swift 1.2 hingga 2.3
Pre Swift 1.2 - Masalah yang diketahui
Pada Swift 1.1, Apple tidak mendukung sintaks di atas tanpa beberapa modifikasi. Lulus
QOS_CLASS_BACKGROUND
tidak benar-benar berfungsi, melainkan gunakanInt(QOS_CLASS_BACKGROUND.value)
.Untuk informasi lebih lanjut, lihat dokumentasi Apel
sumber
Async.background {}
Praktik terbaik adalah mendefinisikan fungsi yang dapat digunakan kembali yang dapat diakses beberapa kali.
FUNGSI YANG DAPAT DIGUNAKAN KEMBALI:
misalnya di suatu tempat seperti AppDelegate.swift sebagai Fungsi Global.
Catatan: di Swift 2.0, ganti QOS_CLASS_USER_INITIATED.value di atas dengan QOS_CLASS_USER_INITIATED.rawValue sebagai gantinya
PEMAKAIAN:
A. Untuk menjalankan proses di latar belakang dengan penundaan 3 detik:
B. Untuk menjalankan proses di latar belakang, kemudian jalankan penyelesaian di latar depan:
C. Menunda 3 detik - perhatikan penggunaan parameter penyelesaian tanpa parameter latar belakang:
sumber
if(background != nil){ background!(); }
denganbackground?()
sintaks yang lebih cepat?DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {
tetapi ini melempar kesalahan seperticannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'
. Solusi yang berfungsi ditemukan di sini (DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
).Jawaban Dan Beaulieu di swift5 (juga berfungsi sejak swift 3.0.1).
Swift 5.0.1
Pemakaian
sumber
background
penutupan sangat sangat sangat lama (~ = tak terbatas). Metode ini dibuat untuk bertahan hingga waktu yang terbatas: waktu yang harus dieksekusi oleh pekerjaan latar belakang Anda. Jadi,completion
penutupan akan dipanggil segera setelah waktu pelaksanaan pekerjaan latar belakang Anda + penundaan telah berlalu.Versi Swift 3
Swift 3 menggunakan
DispatchQueue
kelas baru untuk mengelola antrian dan utas. Untuk menjalankan sesuatu di utas latar yang akan Anda gunakan:Atau jika Anda menginginkan sesuatu dalam dua baris kode:
Anda juga bisa mendapatkan info mendalam tentang GDC di Swift 3 dalam tutorial ini .
sumber
Dari tutorial Jameson Quave
Cepat 2
sumber
Di Swift 4.2 dan Xcode 10.1
Kami memiliki tiga jenis Antrian:
1. Antrian Utama: Antrian utama adalah antrian serial yang dibuat oleh sistem dan dikaitkan dengan utas utama aplikasi.
2. Antrian Global: Antrian global adalah antrian serentak yang dapat kami minta sehubungan dengan prioritas tugas.
3. Antrian khusus: dapat dibuat oleh pengguna. Antrian konkuren kustom selalu dipetakan ke salah satu antrian global dengan menetapkan properti Kualitas Layanan (QoS).
Semua Antrian ini dapat dieksekusi dengan dua cara
1. Eksekusi sinkron
2. Eksekusi asinkron
Dari AppCoda: https://www.appcoda.com/grand-central-dispatch/
sumber
.background
QoS atau.userInitiated
tetapi bagi saya itu berhasil dengan.background
Swift 4.x
Letakkan ini di beberapa file:
dan kemudian menyebutnya di mana Anda butuhkan:
sumber
Anda harus memisahkan perubahan yang ingin Anda jalankan di latar belakang dari pembaruan yang ingin Anda jalankan di UI:
sumber
dispatch_async(dispatch_get_main_queue()) { // update some UI }
dipanggil ketika pernyataan latar belakang (Blok Luar) dilakukan mengeksekusi?Namun jawaban yang bagus, bagaimanapun saya ingin membagikan solusi Berorientasi Objek saya yang terbaru untuk yang cepat 5 .
silakan periksa: AsyncTask
Terinspirasi secara konsep oleh Android AsyncTask, saya sudah menulis kelas sendiri di Swift
AsyncTask memungkinkan penggunaan utas UI yang benar dan mudah. Kelas ini memungkinkan untuk melakukan operasi latar belakang dan menerbitkan hasil pada utas UI.
Berikut adalah beberapa contoh penggunaan
Contoh 1 -
Contoh 2 -
Ini memiliki 2 jenis generik:
BGParam
- jenis parameter yang dikirim ke tugas setelah eksekusi.BGResult
- jenis hasil perhitungan latar belakang.Saat Anda membuat AsyncTask, Anda bisa mengetikkan itu untuk apa pun yang Anda perlukan untuk masuk dan keluar dari tugas latar belakang, tetapi jika Anda tidak membutuhkan jenis itu, Anda dapat menandainya sebagai tidak digunakan dengan hanya mengaturnya ke:
Void
atau dengan sintaks yang lebih pendek:()
Saat tugas asinkron dijalankan, ia melewati 3 langkah:
beforeTask:()->Void
dipanggil pada utas UI tepat sebelum tugas dijalankan.backgroundTask: (param:BGParam)->BGResult
dipanggil di utas latar belakang segera setelahafterTask:(param:BGResult)->Void
dipanggil pada utas UI dengan hasil dari tugas latar belakangsumber
Karena pertanyaan OP sudah dijawab di atas, saya hanya ingin menambahkan beberapa pertimbangan kecepatan:
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
Cepat 5
Untuk membuatnya mudah, buat file "DispatchQueue + Extensions.swift" dengan konten ini:
Penggunaan:
sumber
Grand Central Dispatch digunakan untuk menangani multitasking di aplikasi iOS kami.
Anda dapat menggunakan kode ini
Informasi lebih lanjut menggunakan tautan ini: https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html
sumber
Fungsi serba guna untuk utas
Gunakan seperti:
sumber
Saya benar-benar menyukai jawaban Dan Beaulieu, tetapi itu tidak berhasil dengan Swift 2.2 dan saya pikir kita dapat menghindari bungkusan paksa yang tidak enak itu!
sumber
sumber
di Swift 4.2 ini berfungsi.
sumber