В чем проблема с загрузкой объектов в один контекст управляемого объекта из нескольких потоков? - PullRequest
0 голосов
/ 13 сентября 2011

Хорошо, у меня есть несколько потоков, которые извлекают данные из постоянного хранилища (базы данных SQLite) в один экземпляр NSManagedObjectContext (MOC).Я проверил это довольно тщательно, и в случае, когда операции перекрываются (поток 4 загружается в MOC, а поток 5 тоже)), все работает гладко.и я знаю, что Apple не оправдывает такое поведение, но мне интересно, каковы конкретные причины.В документах Apple кратко ссылается на тот факт, что не только запись опасна, но и чтение, потому что может произойти сбой.Как (если все объекты, которые я загружаю из отдельных потоков, являются отдельными объектами, не перекрывающимися друг с другом)?И не означает ли это, что приложение получит удар по производительности?Поэтому, если я решу, что снижение производительности является лучшим компромиссом, чем увеличение использования памяти, я склонен использовать один метод MOC (не рекомендуется).-Как, но мне просто любопытно узнать о конкретных деталях того, что может произойти, если эти правила не будут соблюдены.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

На самом деле я не знаю, но так как никто еще не ответил.

Не поточно-ориентированный не является поточно-ориентированным.Представьте, что программисты Core Data поместили неэкспонированную переменную экземпляра в NSManagedObjectContext numberOfObjectsLoaded.В потоке A вы получаете доступ к отношению управляемого объекта foo.bar.В потоке B вы вносите изменения в какой-то совершенно не связанный объект baz.number = 14.И foo, и baz являются ошибками.Они загружаются.Оба потока пытаются выполнить строку кода

numberOfObjectsLoaded += 1

Но поток A читает numberOfObjectsLoaded, получает 77, затем переключение контекста.Поток B также читает 77, добавляет 1, присваивает 78. Возвращается к потоку A. Он добавляет 1 к 77, то есть то, что он читает, получает 78, а также назначает 78 для numberOfObjectsLoaded.NumberOfObjectsLoaded должно иметь 79, но имеет 78. Это несоответствие приведет к неожиданным ошибкам и, возможно, в конечном итоге к аварийному завершению.Это произойдет только, может быть, 1/1000 раз, когда вы запустите вашу программу, и, возможно, ничего плохого не будет видно через несколько минут после того, как произошла настоящая ошибка.Очень трудно отлаживать.

Следуй их советам и не пытайся.

0 голосов
/ 14 сентября 2011

Вы извлекали объекты из базы данных или пытались получить доступ к свойствам? Вот когда устраняются неисправности ...

Весьма вероятно, что в какой-то момент ваш код потерпит крах.

...