如何以编程方式获取 Xcode 显示的线程名称



Xcode调试器显示的线程名称类似于;线程N";如果应用程序没有具体重命名它们。我如何在我的应用程序中获得当前线程的名称,因为Xcode会显示它?

或者,Xcode如何确定线程索引?即使应用程序将线程重命名为";某些名称";,Xcode仍然为它分配一个索引,因为线程将在调试器中显示为";某些名称(N(";。

或者,Xcode如何枚举活动线程?

这是底层NSThread的私有/不透明属性,可以使用value(forKeyPath:):检索

if let number = Thread.current.value(forKeyPath: "private.seqNum") as? Int {
...
}

您还可以获得NSThread:的description

let string = Thread.current.description    // <NSThread: 0x600003971340>{number = 7, name = foo}

然后解析出来:

let regEx = try! NSRegularExpression(pattern: #"number = (d+),"#, options: [])
if
let match = regEx.firstMatch(in: Thread.current.description, options: [], range: NSRange(string.startIndex..., in: string)),
let range = Range(match.range(at: 1), in: string)
{
let threadNumberString = String(string[range])
print(threadNumberString)
}

但是,我建议在生产代码中避免使用这两种技术。它们是脆弱的,取决于私人实施的细节。此外,应用商店的指导方针禁止使用私人接口。

所以,如果这只是一个求知欲的问题,那没关系。但我建议不要在实际的应用程序中这样做。此外,在GCD的世界里,我们通常使用队列,并将代码从这些线程细节中抽象出来。

参见:

  • iOS上的NSThread编号
  • po[NSThread currentThread]

最新更新