Ожидание выполнения метода до тех пор, пока условие не будет выполнено в Swift - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть MKMapView с некоторыми аннотациями, добавленными кодом, представляющим пользователей, разделяющих их местоположение. Я получаю обновления об изменениях местоположения через веб-сокеты и обновляю соответствующие MKAnnotation. coordinate, которые представляют аннотации в MKMapView.

Это в основном работает нормально, я вижу, как пользователи перемещаются по карте. Проблема заключается в том, что когда MKAnnotation.cooridnate обновляется, когда пользователь перемещает или увеличивает карту, то MKMapView падает, сообщая, что таблица ha sh была обновлена ​​во время оценки. В основном это проблема: сбой MKMapView при масштабировании при добавлении аннотаций

Обновление: сбой происходит только при включенной кластеризации, не нужно даже панорамировать или масштабировать, обычно достаточно просто немного подождать .

Рекомендованное решение ничего не делает (например, обновление MKAnnotation.cooridnate в моем случае) с MKMapView между regionWillChangeAnimated и regionDidChangeAnimated, и я пытаюсь реализовать это.

Проблема в том, что мои данные принимаются через веб-сокеты, поэтому я не могу просто «прекратить» прослушивание новых данных между этими двумя методами делегатов. Теоретически я могу, но это означало бы потерю некоторых данных, которые не являются решением.

Моя идея заключалась в том, что мне нужна какая-то очередь, которую я буду использовать для добавления своих обновлений в MKAnnotation.cooridnate и буду приостанавливаться в regionWillChangeAnimated и возобновлено в regionDidChangeAnimated.

Я пытался использовать DispatchQueue описанным способом, но через некоторое время он блокируется. Я не уверен, если это из-за большого количества операций, добавляемых к нему или звонков на suspend и resume. Если он не блокируется, он просто через некоторое время вылетает из приложения.

У меня вопрос, какой механизм будет работать здесь?

Как указано в заголовке вопроса, мне в основном нужен способ сделать некоторые методы ожидают условия, скажем, переключение флага между regionWillChangeAnimated и regionDidChangeAnimated, который является надежным и может принять нагрузку.

1 Ответ

0 голосов
/ 25 апреля 2020

Если вы не хотите выполнять задачи при выполнении определенного условия, используйте DispatchQueue и просто suspend или resume. И если это для задач, которые должны выполняться в главной очереди, сделайте главную очередь целевой для этой очереди, которая будет приостановлена ​​и возобновлена:

let annotationChangeQueue = DispatchQueue(label: "...", target: .main)

Но возникает вопрос: при каких условиях надо suspend и resume эту очередь? Было бы разумно предположить (как тот другой вопрос, на который вы ссылаетесь), что можно приостановить в regionWillChangeAnimated и возобновить в regionDidChangeAnimated. Увы, этого недостаточно. Вы обнаружите, что даже если вы не будете вносить никаких изменений в аннотации до regionDidChangeAnimated, он все равно может обработать sh. И MKMapView, по-видимому, не раскрывает какие-либо методы / свойства, которые мы можем наблюдать, чтобы избежать этого.

Я не думаю, что есть правильное решение этой проблемы, учитывая, что Apple не предоставляет никаких свойств что мы могли бы определить, когда безопасно мутировать наши аннотации.

FWIW, я могу проявить эту проблему, только если включу кластеризацию. Кроме того, хотя этот вопрос был сосредоточен на панорамировании / масштабировании, я обнаружил, что смог воспроизвести cra sh без панорамирования / масштабирования. Просто обновлял аннотации (которые участвуют в кластеризации) и вообще не трогал мое устройство, и оно в итоге вылетало с этой ошибкой. Таким образом, хотя это легче проявить с помощью панорамирования / масштабирования, я думаю, что проблема более фундаментальная, а именно то, как представление карты обрабатывает обновления аннотаций (предположительно, только те, которые могут быть кластеризованы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...