Swift 3'te mevcut konu nasıl kontrol edilir?


107

Swift 3'teki mevcut mesaj dizisinin hangisi olduğunu nasıl kontrol ederim?

Swift'in önceki sürümlerinde, bunu yaparak mevcut iş parçacığının ana ileti dizisi olup olmadığını kontrol etmek mümkündü:

NSThread.isMainThread()

Yanıtlar:



108

Thread.isMainThreadşu anda ana UI iş parçacığında olup olmadığınızı gösteren bir boole döndürür. Ancak bu size güncel konuyu vermeyecektir. Size sadece ana yolda olup olmadığınızı söyleyecektir.

Thread.current bulunduğunuz mevcut ileti dizisini döndürür.


24

İş parçacığını ve kuyruğu yazdırmak için bir uzantı yaptım:

extension Thread {
    class func printCurrent() {
        print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
    }
}

Thread.printCurrent()

Sonuç şöyle olacaktır:

⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread

18

Swift 4 ve üzeri:

Thread.isMainThreadBoolkullanıcı Ana İş Parçacığı üzerinde veya Değilse, birisi kuyruğun / iş parçacığının adını yazdırmak isterse bu uzantının yardımcı olacağını belirten döndürür

extension Thread {

    var threadName: String {
        if let currentOperationQueue = OperationQueue.current?.name {
            return "OperationQueue: \(currentOperationQueue)"
        } else if let underlyingDispatchQueue = OperationQueue.current?.underlyingQueue?.label {
            return "DispatchQueue: \(underlyingDispatchQueue)"
        } else {
            let name = __dispatch_queue_get_label(nil)
            return String(cString: name, encoding: .utf8) ?? Thread.current.description
        }
    }
}

Nasıl kullanılır:

print(Thread.current.threadName)

__dispatch_queue_get_labelSwift stdlib'in bir parçası değildir, yalnızca Apple platformuna yönelik çerçevelerin dışında kullanılamaz. Mesela Ubuntu'da arayamıyorum.
Xander Dunn

9

GCD'yı kullanırken kullanabileceğiniz dispatchPrecondition ileri yürütülmesi için gerekli bir gönderme durumunu kontrol etmek. Kodunuzun doğru iş parçacığı üzerinde yürütülmesini garanti etmek istiyorsanız bu yararlı olabilir. Örneğin:

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.