【发布时间】:2019-02-23 22:31:19
【问题描述】:
我注意到在 Xcode 10 中打印大量文本时控制台日志的性能显着下降。例如,在打印收集服务器数据时会发生这种情况。是否有任何已知的解决方案或相关信息?
【问题讨论】:
标签: xcode10
我注意到在 Xcode 10 中打印大量文本时控制台日志的性能显着下降。例如,在打印收集服务器数据时会发生这种情况。是否有任何已知的解决方案或相关信息?
【问题讨论】:
标签: xcode10
我在 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)
}
}
【讨论】:
斯威夫特:
请参考: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
【讨论】:
【讨论】: