如何寫一個顯示iOS線程編號的小擴展

我們在測試iOS下多線程併發編程時往往需要區分不同的線程。

我們知道Thread有一個name實例變量可以用來給線程命名,但是那些系統自動創建的線程你就拿它沒辦法了吧?

在這裏插入圖片描述

其實Thread實例自身是有編號的,不過並沒有直接導出。

我們用以下語句可以窺探一下:

print("\(Thread.current)")

顯示結果爲:

“<NSThread: 0x600000ba2b80>{number = 1, name = main}”

可以看到主線程的編號爲1。

那我們如何取得這個編號呢?

很簡單:解析字符串!!!

在這裏插入圖片描述

是不是很直接!?

其實解析字符串是正則的強項,但這裏使用了另一種更直接,更暴力的方法,博君一笑:

extension Thread{
    var number:Int{
        // 取得線程描述第一部分
        let p0 = self.description.split(separator: ",").map {String($0)}[0]
        // 取得線程描述第二部分
        let p1 = p0.split(separator: "{").map {String($0)}[1]
        // 後面的格式是固定的,所以這裏硬編碼number偏移爲9
        let numberStartIndex = p1.index(p1.startIndex, offsetBy: 9)
        // 這裏很暴力的強轉了,實際代碼中不要學我...
        return Int(String(p1[numberStartIndex...]))!
    }
}

現在對於任何線程我們可以輕鬆取得它們的編號了:

Thread.current.number

That’s all!!!

在這裏插入圖片描述

這是一個短篇,感謝觀賞 ;)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章