我們在測試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!!!
這是一個短篇,感謝觀賞 ;)