Может ли NotificationTokens проходить за пределами потока, из которого они сделаны?

100
11

(Я не смог найти эту информацию в документации или не знаю, где искать, так что простите меня, если это уже объяснено где-то (ссылка была бы полезна).

Мое приложение создает и использует NSThreads для взаимодействия с Realm. Все потоки имеют рабочие Run Loops, установленные на них, поэтому созданные на них Realms будут автообновлены.

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

Пример (псевдокод:

ReadThread {
func performAsync(_ block: ()->Void) {
// execute block on run loop of the thread using self.perform(#selector(), on: self)
}
}

Singleton {
let readThread: ReadThread()

init {
self.readThread.start()
}
}

Main Thread:

Class A {
private var token: NotificationToken?

init {
Singleton.readThread.perform {
let token = realm.observe() { [weak self] (notification: Realm.Notification, realm) in
self?.doWork()
DispatchQueue.main.async { [weak self] in
self?.notifyUI()
}
}

DispatchQueue.main.async {[weak self] in self?.token = token }
}
}
}

Идея заключается в том, что токен создается на ReadThread, но токен хранится в переменной экземпляра в другом потоке (основной поток). Является ли токен потоком достаточно безопасным, чтобы объекты основного потока могли при вызове аренды invalidate() на токене, или если объект основного потока освобожден, токен будет автоматически аннулирован?

Спасибо за вашу помощь!

спросил(а) 2018-04-13T14:07:00+03:00 2 года, 6 месяцев назад
1
Решение
93

Узнал, что это было тяжело, но ответ отрицательный, предзнаменования должны быть признаны недействительными в том же потоке, в котором был создан токен. В противном случае исключение среды выполнения будет выбрано с помощью проверки Realm.verifyThread.

ответил(а) 2018-04-21T10:51:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема