NSError.setUserInfoValueProvider бесконечный цикл - PullRequest
0 голосов
/ 30 октября 2018

NSError.setUserInfoValueProvider(forDomain:provider:) был представлен в MacOS 10.11 / iOS 9 как способ заполнения словаря userInfo для NSError для данной области ошибок с использованием блока, что позволяет избежать большого количества шаблонов и повторение в коде, который может выдать.

Я пытался использовать это так:

if NSError.userInfoValueProvider(forDomain: "Test") == nil {
    NSError.setUserInfoValueProvider(forDomain: "Test"){ err, userInfoKey in
        print("This is an error:", err, userInfoKey)
        return nil
    }
}

Сайт вызова выглядит так:

throw NSError(domain: "Test", code: 0, userInfo: nil)

Когда выдается ошибка, журнал заполняется «Это ошибка:», но сама ошибка или userInfoKey никогда не распечатывается. Программа окончательно прерывается с последним сообщением в журнале:

предупреждение: не удалось выполнить код поддержки для чтения данных класса Objective-C в процессе. Это может снизить качество информации о типе имеется.

1 Ответ

0 голосов
/ 30 октября 2018

Проблема в том, что печать err в

print("This is an error:", err, userInfoKey)

рекурсивно вызывает один и тот же поставщик значений, поскольку определяется строковое представление ошибки. Затем программа в конечном итоге падает с переполнением стека. Вы можете проверить это, установив точку останова в этой строке.

Если вы измените строку на

print("This is an error:", userInfoKey)

тогда все работает как положено.

...