Точки останова Swift Xcode 11 для условных выражений не работают - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь добавить точку останова Symboli c в XCode для проверки модификаций механизма пользовательского интерфейса в фоновом потоке.

Я делаю следующее:

enter image description here

Однако сообщение об ошибке, которое я получаю, всегда:

Stopped due to an error evaluating condition of breakpoint 5.1: "!Thread.isMainThread"
Couldn't parse conditional expression:
error: use of undeclared identifier 'Thread'

UI Engine must be modified on main thread.

Я не понимаю, почему условие точки останова не может оценить мое состояние. Может кто-нибудь объяснить, что я могу делать здесь не так? Я попытался поместить это в Obj- c, но не повезло.

EDIT: версия Obj- C, здесь: !(BOOL)[NSThread isMainThread]

EDIT 2: версия Xcode Version 11.3 (11C29)

РЕДАКТИРОВАТЬ 3: Итак, закрытие XCode и повторное открытие заставили версию «Obj- C» «работать», они делают паузу на точке останова примерно на 4-5 минут каждый раз. Это эффективно делает эти точки останова непригодными. Не уверен, как решить эту проблему.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Я смог заставить Вашу исходную символику c работать с точкой останова, как ожидалось, написав условие как

(BOOL)[NSThread isMainThread] == NO

Я подозреваю, что есть лучший способ, и сравнение BOOL напрямую с NO - очень плохой стиль , но, по крайней мере, я прошел стадию «не работает» к стадии «работает».

0 голосов
/ 28 января 2020

Для пояснения, установка символов c точек останова и использование условий ДЕЙСТВИТЕЛЬНО работают, но я бы рискнул, что self и Thread не будут доступны в качестве символов для большей части инфраструктуры UIKit, потому что для большей части этого нет отладочной информации, следовательно ошибка: использование необъявленного идентификатора 'Thread'.

См. ответ в этом сообщении:

Как выйти из системы самостоятельно, когда добавить точку останова символа в методе [UIViewController viewWillAppear]

Существует также дополнительная информация о создании символов c точек останова для дочерних классов и возможного обходного пути с использованием условия target- c здесь:

Использование символов c точки останова для дочерних классов в Xcode?

При этом, если вас интересуют только те классы в ваших модулях, где вызывается этот метод (layoutSubviews), вы можете указать модуль внутри symboli c точка останова, и если у вас есть собственная реализация этого метода (например, у вас есть ov ошибочно указать его в коде вашего класса), условие Thread.isMainThread или! Thread.isMainThread фактически будет работать для этого класса.

Я знаю, что это на самом деле может не решить вашу дилемму, особенно если вам нужно проверить все вызовы layoutSubviews, но я надеюсь, что это хотя бы поможет объяснить, почему условие, использующее Thread, не работает постоянно.

...