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

Posted

技术标签:

【中文标题】如何以编程方式获取 Xcode 显示的线程名称【英文标题】:How to Get Xcode's Displayed Thread Name Programmatically 【发布时间】:2021-03-16 19:01:34 【问题描述】:

如果应用程序没有特别重命名线程,Xcode 调试器会显示名称如“线程 N”的线程。如何在我的应用程序中获取当前线程的名称,因为 Xcode 会显示它?

另外,Xcode 如何确定线程索引?即使应用程序将线程重命名为“Some Name”,Xcode 仍会为其分配一个索引,因为线程将在调试器中显示为“Some Name (N)”。

另外,Xcode 如何枚举活动线程?

【问题讨论】:

【参考方案1】:

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

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

您也可以得到descriptiondescription

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)

但是,我建议在生产代码中避免使用这两种技术。它们很脆弱,取决于私有实现细节。此外,App Store 指南禁止使用私有接口。

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

见:

NSThread number on ios? po [NSThread currentThread]

【讨论】:

以上是关于如何以编程方式获取 Xcode 显示的线程名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 5 中以编程方式在特定屏幕(即主显示器而不是外部显示器)上显示窗口? [苹果系统; Xcode 15]

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?

如何以编程方式在线程中获取事务管理器?

如何在 iPhone sdk 中以编程方式获取设备名称?

Xcode - 我如何以编程方式在容器视图中嵌入/更改视图控制器?