当前位置: 首页 > 知识库问答 >
问题:

Xcode 10控制台日志在打印大量文本时速度较慢

干鑫鹏
2023-03-14

我注意到在 Xcode 10 中打印大量文本时控制台日志的性能显著下降。例如,在打印收集服务器数据时会发生这种情况。是否有任何已知的解决方案或有关这方面的信息?

共有3个答案

韩祯
2023-03-14

Swift银行:

请参阅:Xcode需要很长时间才能打印调试结果。

public func PrintLogs(_ message: Any, file: String = #file, function: String = #function, line: Int = #line) {
    #if DEBUG
    let className = file.components(separatedBy: "/").last ?? ""
    let classNameArr = className.components(separatedBy: ".")
    NSLog("\n\n--> Class Name:  \(classNameArr[0]) \n--> Function Name: \(function) \n--> Line: \(line)")
    print("--> Log Message: \(message)")
    #endif
}

用法:调用PrintLogs(“Hello”)而不是print(“Hello”)

样品输出:

--> Class Name:  HomeViewController 
--> Function Name: logTest() 
--> Line: 81
--> Log Message: Hello
汪成仁
2023-03-14

尝试使用 NS 日志

NSLog("SomeMessage: \(someParam)")

[iOS日志程序]

郑晨
2023-03-14

我在Swift中使用print命令也有同样的问题,但前提是附加了调试器。

我通过检查调试器是否已连接,然后使用NSLog而不是打印来解决它。

要检查您的应用程序是否在调试器模式下运行,请参见此处:检测Swift应用程序是否从Xcode运行

考虑到Xcode 8 iOS 10及以上版本的日志条目被截断,看这里:iOS 10 / Xcode 8中设备上的NSLog似乎被截断?为什么?

编辑 05.03.2019:

我用https://stackoverflow.com/a/39907046/6330248的溶液修好了

斯威夫特 4.2:

extension String {
    func components(withLength length: Int) -> [String] {
        guard length > 0 else {
            return [self]
        }

        return stride(from: 0, to: self.count, by: length).map {
            let start = self.index(self.startIndex, offsetBy: $0)
            let end = self.index(start, offsetBy: length, limitedBy: self.endIndex) ?? self.endIndex
            return String(self[start..<end])
        }
    }
}

func amIBeingDebugged() -> Bool {
    var info = kinfo_proc()
    var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
    var size = MemoryLayout<kinfo_proc>.stride
    let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
    assert(junk == 0, "sysctl failed")
    return (info.kp_proc.p_flag & P_TRACED) != 0
}

func FixedNSLog(_ format: String, _ args: CVarArg...) {

    let maxStringLength = 800
    let string = String(format: format, arguments: args)

    let substrings = string.components(withLength: maxStringLength)
    let substringsCount = substrings.count

    if substringsCount > 1 {
        NSLog("!!! WARNING !!! The following message is printed by \(substringsCount) parts, because of Xcode 10 console issues")
    }

    substrings.forEach { (substring) in
        NSLog(substring)
    }

}

func log(_ message: String) {
    if amIBeingDebugged() {
        FixedNSLog(message)
    }
    else {
        print(message)
    }
}
 类似资料:
  • 控制台日志是一个强大的方法,用来检查您的页面或应用程序。让我们从console.log()开始,探索其他高级用法。 TL;DR 使用console.log()进行基本日志记录 使用console.erroe()和console.warn()获取醒目的内容 使用console.group()和console.groupEnd()来分组相关消息,避免混乱 使用console.assert()显示条件语

  • 我正在为我的应用程序使用spring boot,并且我正在使用默认的spring boot日志记录。 是否有任何配置来防止spring boot将日志消息打印到控制台?

  • 问题内容: 我想在量角器测试中输出div的文本,到目前为止,我有: 但这输出 我尝试了“ toString()”,结果相同。 有没有办法将文本输出到控制台? 问题答案: 和其他大多数量角器方法都返回承诺。您想将您的陈述放入承诺解决方案中: 使用新的量角器语法:

  • 我假设eclipse中存在一些限制,阻止将大量数字打印到控制台。 编辑:在5572处,控制台的输出将被清除,这是输出: 你想看多少个素数?5572

  • 为了测试这一点,我注释掉了this.SetState调用并再次尝试,console.log()将按预期打印预更新值,因为它不再进入updateInput方法。这是有道理的,但我不确定如何获得预更新console.log值。

  • > 我试图将JSON文件导入变量,但变量中只显示前几个字符 样本。json是200000个字符,当我在控制台上打印变量时,只打印前3756个字符。通过控制台打印的字符是否有任何限制。日志 完整数据保存在样本变量