Apakah ada cara untuk memeriksa apakah utas saat ini adalah utas utama di Objective-C atau bukan?
Saya ingin melakukan sesuatu seperti ini.
- (void)someMethod
{
if (IS_THIS_MAIN_THREAD?) {
NSLog(@"ok. this is main thread.");
} else {
NSLog(@"don't call this method from other thread!");
}
}
objective-c
iphone
multithreading
cocoa
xamarin.ios
kentang ikan
sumber
sumber
Jawaban:
Lihat
NSThread
dokumentasi API .Ada metode seperti
- (BOOL)isMainThread
+ (BOOL)isMainThread
dan
+ (NSThread *)mainThread
sumber
Jika Anda ingin sebuah metode dijalankan di utas utama, Anda dapat:
sumber
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
bukandispatch_async()
dalam contoh Anda.Di Swift3
sumber
Jika Anda ingin mengetahui apakah Anda berada di thread utama atau tidak, Anda cukup menggunakan debugger. Tetapkan breakpoint pada garis yang Anda minati, dan ketika program Anda mencapainya, panggil ini:
(lldb) thread info
Ini akan menampilkan informasi tentang utas tempat Anda berada:
(lldb) thread info thread #1: tid = 0xe8ad0, 0x00000001083515a0 MyApp`MyApp.ViewController.sliderMoved (sender=0x00007fd221486340, self=0x00007fd22161c1a0)(ObjectiveC.UISlider) -> () + 112 at ViewController.swift:20, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
Jika nilainya
queue
adalahcom.apple.main-thread
, maka Anda berada di utas utama.sumber
Pola berikut akan memastikan sebuah metode dijalankan di utas utama:
sumber
_cmd
akan secara otomatis menggunakan metode di mana cuplikan Anda ditempelkan ke ʕ • ᴥ • ʔDua arah. Dari jawaban @ rano,
Juga,
sumber
perhatikan bahwa saya memeriksa antrian operasi, bukan utas, karena ini adalah pendekatan yang lebih aman
sumber
Untuk Monotouch / Xamarin iOS Anda dapat melakukan pemeriksaan dengan cara ini:
sumber
Versi Swift
sumber
periksa jawaban ini dari https://stackoverflow.com/a/34685535/1530581
sumber
Detail
Solusi 1. Deteksi antrian apapun
Dapatkan DispatchQueue saat ini?
Solusi 2. Deteksi antrian utama saja
Pemakaian
Sampel
Hasil (log)
sumber
sumber
UPDATE: sepertinya itu bukan solusi yang benar, menurut header queue.h seperti yang disebutkan @demosten
Pikiran pertama dibawa ke saya, ketika saya dibutuhkan fungsi ini adalah baris:
Dan telah melihat solusi yang diterima:
solusi tambang 2,5 kali lebih cepat.
PS Dan ya, saya sudah memeriksa, itu berfungsi untuk semua utas
sumber
When dispatch_get_current_queue() is called on the main thread, it may or may not return the same value as dispatch_get_main_queue(). Comparing the two is not a valid way to test whether code is executing on the main thread.