【问题标题】:Xcode 10 console logs are slow when printing large amount of text打印大量文本时,Xcode 10 控制台日志很慢
【发布时间】:2019-02-23 22:31:19
【问题描述】:

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

【问题讨论】:

    标签: xcode10


    【解决方案1】:

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

    我通过检查是否附加了调试器然后使用NSLog 而不是print 解决了这个问题。

    要检查您的应用是否在调试器模式下运行,请参阅此处:Detect if Swift app is being run from Xcode

    考虑使用 Xcode 8 + iOS 10 及更高版本,日志条目会被截断,请参见此处:NSLog on devices in iOS 10 / Xcode 8 seems to truncate? Why?

    编辑 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)
        }
    }
    

    【讨论】:

    • 但是如果你需要调试呢?
    【解决方案2】:

    斯威夫特:

    请参考:Xcode takes long time to print debug results.

    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
    

    【讨论】:

      【解决方案3】:

      尝试使用NSLog

      NSLog("SomeMessage: \(someParam)")
      

      [iOS logger]

      【讨论】:

        猜你喜欢
        • 2016-12-20
        • 2018-10-04
        • 2015-10-28
        • 1970-01-01
        • 2011-04-12
        • 2020-03-17
        • 2018-11-28
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多