Журналы консоли Xcode 10 работают медленно при печати большого количества текста - PullRequest
0 голосов
/ 19 сентября 2018

Я заметил значительное снижение производительности журналов консоли при печати больших объемов текста в Xcode 10. Например, это происходит при печати данных сервера сбора.Есть ли какое-либо известное решение или информация по этому поводу?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

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
0 голосов
/ 09 октября 2018

У меня та же проблема в Swift с командой print, но только если подключен отладчик.

Я решил ее, проверив, подключен ли отладчик, а затем используя NSLog вместо print.

Чтобы проверить, работает ли ваше приложение в режиме отладчика, см. Здесь: Определите, запущено ли приложение Swift из Xcode

Учтите, что с Xcode 8 +В iOS 10 и выше записи журнала усечены, см. здесь: NSLog на устройствах в iOS 10 / Xcode 8 кажется усеченным?Почему?

Изменить 05.03.2019:

Я исправил это с помощью решения из https://stackoverflow.com/a/39907046/6330248

Swift 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)
    }
}
...