2016-04-27 3 views
0

У меня есть конструкция iOS, где я получаю обратные вызовы из базового класса. Этот обратный вызов вносит изменения в NSMutablearray.Что происходит, когда NSTimer пинает

В то же время у меня есть NSTimer, который выполняет обратный вызов метода, который вносит изменения в тот же массив NSMutable.

Я вижу здесь потенциальную проблему, если обратные вызовы «сталкиваются» с NSMutablearray.

Я не уверен, как с этим бороться. Может ли NSLock сделать трюк или я должен создать экземпляр NSMutablearray как атомный?

+0

Вы используете несколько потоков? Если нет, таймер не загорится, пока не закончится другой код. Таймеры не срабатывают до следующего раза, когда ваш код вернется и посещает цикл событий. –

+0

Независимо от того, что вы делаете, имейте в виду, что только блокировка может не решить все ваши проблемы, то есть даже если каждый доступ к массиву заблокирован, этого может быть недостаточно, чтобы сделать его потокобезопасным. Быстрый пример: более длительная операция, требующая множественного доступа к массиву, но массив, возможно, изменился между ними. – Eiko

ответ

2

Вы должны убедиться, что любые изменения в изменяемом массиве происходят в одном потоке. Это позволит избежать «столкновений». Если ваш таймер срабатывает в основном потоке, и ваш обратный вызов также встречается в основном потоке, все хорошо.

Если таймер и обратный вызов находятся в разных потоках, вы можете сериализовать доступ к массиву с помощью последовательной очереди GCD. Когда вы это делаете, ЛЮБОЙ И ВСЕ доступ к этому массиву должен выполняться в этой очереди (например, сохраняйте ссылку на эту очередь в свойстве).

NSLock может вам помочь, но если вы работаете над основным потоком, это, как правило, не очень хорошая идея, так как вы можете блокировать основную очередь, которая влияет на поведение пользователя/прокрутку.

Кроме того, атомный только означает, что получение или установки указатель на массив является поточно, т.ми .: действительного значение будет возвращено или установить (DORS не означает, что она будет правильно значения, хотя). Любые операции, которые вы делаете на этом, не имеют ничего общего с тем, что свойство является атомарным или неатомоксным.

Смежные вопросы