3

Рекомендованный Apple метод для многопоточных данных ядра - использовать контекст управляемого объекта для каждого потока и отправлять изменения из одного контекста в другой, сохраняя контекст измененного потока в общем постоянном хранилище.Достаточно ли для других потоков иметь косвенный доступ к контексту управляемого объекта, который работает в потоке?

Хотя я могу представить, что это нормально, например. читатель RSS, для некоторых приложений он кажется далеким от идеала. В моем случае я пишу музыкальный секвенсор, который записывает данные &, используя фоновый поток. Мне нужно, чтобы записанные данные были доступны для основного потока во время записи/воспроизведения. Чтобы постоянно сохранять и загружать данные во время записи/воспроизведения, было бы достаточно плохо, но, что еще хуже, казалось бы, это заставило пользователя сохранять всякий раз, когда они записывают или играют, что вроде бы кричит «ужасное приложение».

Однако, похоже, что это может быть способ обойти это. Если другим потокам не нужен доступ к основным объектам данных (только содержащимся в них данным), что мешает мне запустить контекст управляемого объекта в его собственном потоке и разрешить только косвенный доступ к другим потокам, например, путем привязки интерфейса объекты для свойства, которое вызывает performSelector:onThread:withObject:waitUntilDone: в потоке контекста управляемого объекта, чтобы получить/установить значения?

Это не дает некоторых преимуществ многопоточности (то есть масштабирования основных данных для многоядерных процессоров), но в то же время мы просто хотим многопоточности, чтобы избежать блокировки пользовательского интерфейса, в то время как происходит что-то интенсивное.

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

ответ

2

У вас нет контроля над деталями реализации объектов NSManagedObject и, в частности, есть причины, по которым CoreData, возможно, потребуется что-то сделать в контексте, когда вы читаете атрибут.

Для ваших конкретных нужд я бы предложил оптимизированное изолированное решение для буферов и очередей, в котором вы копируете то, что нужно от объектов CD, прежде чем передавать их в поток обработки фона.


Вы можете использовать performSelector: на * Тема: если вы хотите, но тогда вы будете иметь дело с проблемами синхронизации, задержки и других забавных битов параллелизм. Лично я бы пошел с описанным выше механизмом очередей.

+0

Спасибо. Думаю, моя мысль состоит в том, что при наличии нескольких потоков, отправляющих performSelector: onThread ... в NSManagedObject будет помещать сообщения чтения/записи в очередь, что (я надеюсь) дает нам оптимизированный буфер и очередь бесплатно. Независимо от того, что NSManagedObject должен делать внутренне, он не будет запускать аксессуар №2 до тех пор, пока это не будет выполнено с помощью accessor # 1, правильно? –

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

  • Нет связанных вопросов^_^