我们在测试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!!!
这是一个短篇,感谢观赏 ;)